本文介绍了将参数从片段传递到其容器活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个 fragments time date picker .我需要发送用户从片段中选择的数据,并将它们传递给 fragments活动,以便合并数据并将其发送给另一个 activity .我使用此解决方案链接,但数据为 null .

I have two fragments with time and date picker.I need to send data chosen by the user from the fragment and pass them to to fragments activity, in order to combine data and send it to another activity.I used this solution Link but data is null.

这是 FragmentOne - FramentTwo 相同

public FragmentOne(){}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   View view = inflater.inflate(R.layout.fragment_one_layout,container,false);

   //FROM SIDE
   timeButtonFrom = (Button)view.findViewById(R.id.time_button);
   dateButtonFrom = (Button)view.findViewById(R.id.date_button);
   tvDateFrom = (TextView)view.findViewById(R.id.time_textview);
   tvTimeFrom = (TextView)view.findViewById(R.id.date_textview);


    timeButtonFrom.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           Calendar now = Calendar.getInstance();
           // TimePickerDialog tpd = TimePickerDialog.newInstance(
           TimePickerDialog tpd = TimePickerDialog.newInstance(
                   FragmentOne.this,
                   now.get(Calendar.HOUR_OF_DAY),
                   now.get(Calendar.MINUTE),true);//24H Enable, If 12 set false
           tpd.setThemeDark(true);
           tpd.enableMinutes(true);
           tpd.setTitle("Choose Time");
           tpd.setTimeInterval(1,15);//setTimeInterval to 1H and 15Min


           tpd.setOnCancelListener(new DialogInterface.OnCancelListener() {
               @Override
               public void onCancel(DialogInterface dialogInterface) {
                   Log.d("TimePicker", "Dialog was cancelled");
               }
           });

           tpd.show(getFragmentManager(), "ChooseTimeFrom");
       }
   });// end Button Listener FROM

   dateButtonFrom.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           Calendar now = Calendar.getInstance();
           DatePickerDialog dpd = DatePickerDialog.newInstance(
                   FragmentOne.this,
                   now.get(Calendar.YEAR),
                   now.get(Calendar.MONTH),
                   now.get(Calendar.DAY_OF_MONTH)
           );
           dpd.setThemeDark(true);
           dpd.showYearPickerFirst(true);
           dpd.setTitle("Choose Date");
           dpd.show(getFragmentManager(), "ChooseDateFrom");
       }
   });//END DATEBUTTONFROM
  return  view;

}//END ONCREATEVIEW

@Override
public void onResume() {
    super.onResume();
    DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("ChooseDateFrom");
    if(dpd != null) dpd.setOnDateSetListener(this);
    TimePickerDialog tpd = (TimePickerDialog) getFragmentManager().findFragmentByTag("ChooseTimeFrom");
    if(tpd != null) tpd.setOnTimeSetListener(this);

}



@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {

    String date = "You picked the following date: "+year+"/"+(++monthOfYear)+"/"+dayOfMonth;
    tvDateFrom.setText(date);

}

@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {

    String hourString = hourOfDay < 10 ? "0"+hourOfDay : ""+hourOfDay;
    String minuteString = minute < 10 ? "0"+minute : ""+minute;
    String secondString = second < 10 ? "0"+second : ""+second;
    String time = "You picked the following time: "+hourString+"h"+minuteString+"m"+secondString+"s";
    tvTimeFrom.setText(time);
}

这是我的活动

public class DatePickerActivity extends AppCompatActivity {
private static final String TAG = "DatePickerActivity";
ViewPager viewPager;
PickerAdapter adapter;
String myString = "TEST";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.date_fragment);
    String strObj = getIntent().getStringExtra("Location");
    GetParamsClass getParamsClass = new Gson().fromJson(strObj,GetParamsClass.class);

    adapter = new PickerAdapter(getFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(adapter);

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    for(int i=0;i<adapter.getCount();i++) tabLayout.getTabAt(i).setText(adapter.getTitle(i));



}

public String getMyData() {
    return myString;
}

class PickerAdapter extends android.support.v13.app.FragmentPagerAdapter {
    private static final int NUM_PAGES = 2;
    Fragment fragmentOne;
    Fragment fragmentTwo;

    public PickerAdapter(FragmentManager fm) {
        super(fm);
        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0:
                return fragmentOne;
            case 1:
            default:
                return fragmentTwo;
        }
    }

    public int getTitle(int position) {
        switch(position) {
            case 0:
                return R.string.tab_title_time;
            case 1:
            default:
                return R.string.tab_title_date;
        }
    }
}
}

编辑

public class DatePickerActivity extends AppCompatActivity implements  FragmentOne.OnDateTimeSelectedListener {
private static final String TAG = "DatePickerActivity";
ViewPager viewPager;
PickerAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.date_fragment);

    adapter = new PickerAdapter(getFragmentManager(),this);
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(adapter);

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    for(int i=0;i<adapter.getCount();i++) tabLayout.getTabAt(i).setText(adapter.getTitle(i));
}

@Override
public void onDateTimeSelected(String date) {
    Log.d(TAG, "onDateTimeSelected: "+ date);
}

class PickerAdapter extends android.support.v13.app.FragmentPagerAdapter {
    private static final int NUM_PAGES = 2;
    Fragment fragmentOne;
    Fragment fragmentTwo;

    public PickerAdapter(FragmentManager fm,DatePickerActivity activity) {
        super(fm);
        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();
        fragmentOne.setOnDateTimeSelectedListener(activity);//THIS LINE GIVES ERROR

    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0:
                return fragmentOne;
            case 1:
            default:
                return fragmentTwo;
        }
    }

    public int getTitle(int position) {
        switch(position) {
            case 0:
                return R.string.tab_title_time;
            case 1:
            default:
                return R.string.tab_title_date;
        }
    }
}

第一片段

public class FragmentOne extends DialogFragment implements DatePickerDialog.OnDateSetListener,TimePickerDialog.OnTimeSetListener {

Button timeButtonFrom ;
Button dateButtonFrom;
TextView tvDateFrom ;
TextView tvTimeFrom ;


public interface OnDateTimeSelectedListener{
    void onDateTimeSelected(String date);
}



private OnDateTimeSelectedListener onDateTimeSelectedListener;

public void setOnDateTimeSelectedListener(OnDateTimeSelectedListener onDateTimeSelectedListener){
    this.onDateTimeSelectedListener = onDateTimeSelectedListener;
}

public OnDateTimeSelectedListener getOnDateTimeSelectedListener(){
    return onDateTimeSelectedListener;
}




public FragmentOne(){}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View view = inflater.inflate(R.layout.fragment_one_layout,container,false);

    //FROM SIDE
    timeButtonFrom = (Button)view.findViewById(R.id.time_button);
    dateButtonFrom = (Button)view.findViewById(R.id.date_button);
    tvDateFrom = (TextView)view.findViewById(R.id.time_textview);
    tvTimeFrom = (TextView)view.findViewById(R.id.date_textview);



    timeButtonFrom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar now = Calendar.getInstance();
            // TimePickerDialog tpd = TimePickerDialog.newInstance(
            TimePickerDialog tpd = TimePickerDialog.newInstance(
                    FragmentOne.this,
                    now.get(Calendar.HOUR_OF_DAY),
                    now.get(Calendar.MINUTE),true);//24H Enable, If 12 set false
            tpd.setThemeDark(true);
            tpd.enableMinutes(true);
            tpd.setTitle("Choose Time");
            tpd.setTimeInterval(1,15);//setTimeInterval to 1H and 15Min


            tpd.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialogInterface) {
                    Log.d("TimePicker", "Dialog was cancelled");
                }
            });

            tpd.show(getFragmentManager(), "ChooseTimeFrom");
        }
    });// end Button Listener FROM

    dateButtonFrom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar now = Calendar.getInstance();
            DatePickerDialog dpd = DatePickerDialog.newInstance(
                    FragmentOne.this,
                    now.get(Calendar.YEAR),
                    now.get(Calendar.MONTH),
                    now.get(Calendar.DAY_OF_MONTH)
            );
            dpd.setThemeDark(true);
            dpd.showYearPickerFirst(true);
            dpd.setTitle("Choose Date");
            dpd.show(getFragmentManager(), "ChooseDateFrom");
        }
    });//END DATEBUTTONFROM




    return  view;

}//END ONCREATEVIEW

@Override
public void onResume() {
    super.onResume();
    DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("ChooseDateFrom");
    if(dpd != null) dpd.setOnDateSetListener(this);
    TimePickerDialog tpd = (TimePickerDialog) getFragmentManager().findFragmentByTag("ChooseTimeFrom");
    if(tpd != null) tpd.setOnTimeSetListener(this);

}



@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {

    String date = "You picked the following date: "+year+"/"+(++monthOfYear)+"/"+dayOfMonth;
    tvDateFrom.setText(date);

    if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().equals("")){

        String dateTimeString = date + tvTimeFrom.getText().toString();
        onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
    }


}

@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {

    String hourString = hourOfDay < 10 ? "0"+hourOfDay : ""+hourOfDay;
    String minuteString = minute < 10 ? "0"+minute : ""+minute;
    String secondString = second < 10 ? "0"+second : ""+second;
    String time = "You picked the following time: "+hourString+"h"+minuteString+"m"+secondString+"s";
    tvTimeFrom.setText(time);

    if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().equals("")){

        String dateTimeString = tvDateFrom.getText().toString() + time;
        onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
    }




}
}//END FRAGMENT CLASS

推荐答案

尝试一下,在FragmentOne中创建一个界面,说

Try this,In FragmentOne Create an interface say

public interface OnDateTimeSelectedListener{
    void onDateTimeSelected(String date, S)
}



private OnDateTimeSelectedListener onDateTimeSelectedListener;

public void setOnDateTimeSelectedListener(OnDateTimeSelectedListener onDateTimeSelectedListener){
        this.onDateTimeSelectedListener = onDateTimeSelectedListener;
}

public OnDateTimeSelectedListener getOnDateTimeSelectedListener(){
        return onDateTimeSelectedListener;
}

在onDateSet(...)方法中检查是否已选择时间,如果是,则调用回调

In onDateSet(...) method check is time already selected if yes then call the callback

if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().trim.equals("")){

    String dateTimeString = date + tvTimeFrom.getText().toString();
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}

在onTimeSet方法中,检查是否已选择时间,如果是,则调用回调

In onTimeSet method check is time already selected if yes then call the callback

if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().trim.equals("")){

    String dateTimeString = tvDateFrom.getText().toString() + time;
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}

在DatePickerActivity中

In DatePickerActivity

更新此行:

public class DatePickerActivity extends AppCompatActivity implements FragmentOne.OnDateTimeSelectedListener{


 // update inside

更新:

   adapter = new PickerAdapter(getFragmentManager(), this);
  ....

和在

public PickerAdapter(FragmentManager fm)

构造函数更新构造函数并尝试设置侦听器

constructor update the constructor and try to set the listener

更新

public PickerAdapter(FragmentManager fm, DatePickerActivity activity) {
        super(fm);
        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();
fragmentOne.setOnDateTimeSelectedListener(activity);
    }

并覆盖

void onDateTimeSelected(String datetimeString){
    //You will get DatetimeString here
    //use it

}

更新

删除出现错误的那一行,然后添加这两种方法,然后尝试

Remove that line which was giving error and add these 2 methods and try

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
          onDateTimeSelectedListener = (OnDateTimeSelectedListener) activity;

    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }

}

@Override
public void onDetach(){
super.onDetach();
onDateTimeSelectedListener = null

}

参考资料:与其他片段通信

这篇关于将参数从片段传递到其容器活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 21:14