我有兩個fragments
與time
和date picker
。 我需要發送用戶從片段中選擇的數據,並將它們傳遞給fragments activity
,以合併數據並將其發送到另一個activity
。我使用這個解決方案Link但數據是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
我沒有看到你的代碼,但與你的問題的標題,我可以說你可以使用接口發回一些數據的活動。 – Raghavendra
你有沒有相同的例子? –
檢查解決方案http://stackoverflow.com/questions/40520149/how-to-refresh-recyclerview-in-one-fragment-when-data-changed-in-another-fragmen/40521446#40521446 – Raghavendra