问题描述
我有两个 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
}
参考资料:与其他片段通信
这篇关于将参数从片段传递到其容器活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!