[英]Passing argument from a fragment to its container activity
我有兩個fragments
,分別是time
和date picker
。 我需要發送用戶從片段中選擇的數據,並將其傳遞給fragments activity
,以便合並數據並將其發送到另一個activity
。 我使用此解決方案鏈接,但數據為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
Class Activity1
{
private String pickedDateValue;
public setPickedDateValue(string val)
{
pickedDateValue = val;
}
}
Class Fragment1
{
Activity1 act1 = (Activity1)getActivity();
act1.setPickedDateValue(pickedval)
}
//其中pickval是從日期/時間選擇器中選擇的值
試試這個,在FragmentOne中創建一個界面說
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(...)方法中,檢查是否已選擇時間,如果是,則調用回調
if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().trim.equals("")){
String dateTimeString = date + tvTimeFrom.getText().toString();
onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}
在onTimeSet方法中檢查是否已選擇時間,如果是,則調用回調
if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().trim.equals("")){
String dateTimeString = tvDateFrom.getText().toString() + time;
onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}
在DatePickerActivity中
更新此行:
public class DatePickerActivity extends AppCompatActivity implements FragmentOne.OnDateTimeSelectedListener{
// update inside
更新:
adapter = new PickerAdapter(getFragmentManager(), this);
....
和在
public PickerAdapter(FragmentManager fm)
構造函數更新構造函數並嘗試設置偵聽器
更新
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
}
更新
刪除出現錯誤的那一行,然后添加這兩種方法,然后嘗試
@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
}
參考: 與其他片段通信
如果它的父活動,則在您的片段中添加此代碼。
((DatePickerActivity)getBaseActivity()).saveData();
您可以調用saveData()
函數或將數據作為Bundle對象傳遞。 在活動中添加保存數據。
您應該使用Callback接口在Fragment和它的主機Activity之間進行干預。 例如:
在界面中聲明,並聲明與數據的關系,您需要將其作為參數發送給Activity
public interface Callback { void onDataPicked(Data data); }
您的活動應實現此接口。 在覆蓋的方法中編寫您自己的代碼。 例如:
@Override public void onDataPicked(Data data) { Intent intent = new Intent(this, AnotherActivity.class); intent.putExtra("some_data", data); startActivity(intent); }
在Fragment的onAttach方法中聲明Callback實例並獲取指向宿主Activity的鏈接。
private Callback mCallback; @Override public void onAttach(Context context) { super.onAttach(context); if(context instanceof Callback){ mCallback = (Callback) context; } }
最后,當您的數據准備就緒時,調用Calback實例的方法ant將在Activity中運行
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Button button = (Button) view.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCallback.onDataPicked(new Data()); } }); }
不要忘記在Fragment的onDetach()方法中將mCallback設置為null以避免內存泄漏
@Override public void onDetach() { super.onDetach(); mCallback = null; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.