2016-11-24 78 views
0

我有两个fragmentstimedate 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 
+0

我没有看到你的代码,但与你的问题的标题,我可以说你可以使用接口发回一些数据的活动。 – Raghavendra

+0

你有没有相同的例子? –

+0

检查解决方案http://stackoverflow.com/questions/40520149/how-to-refresh-recyclerview-in-one-fragment-when-data-changed-in-another-fragmen/40521446#40521446 – Raghavendra

回答

1

试试这个, 在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) 

构造更新构造并尝试设置监听

UPDATE

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 

} 

UPDATE

删除线,是给错误并添加这2种方法,并尝试

@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 

} 

参考:Communicating with Other Fragments

0

如果它的父级活动,然后在你的片段只是添加此代码。

((DatePickerActivity)getBaseActivity()).saveData(); 

您可以调用saveData()函数或将数据传递为Bundle对象。在活动中添加保存数据。

+0

你有一些例子吗?谢谢 –

1
Class Activity1 
{ 
private String pickedDateValue; 

public setPickedDateValue(string val) 
{ 
pickedDateValue = val; 
} 
} 

Class Fragment1 
{ 
    Activity1 act1 = (Activity1)getActivity(); 
    act1.setPickedDateValue(pickedval) 
} 

//其中pickedvalis值从日期/时间选择器

0

拿起你应该使用回调接口片段之间interract和它的主机活动。例如:

  1. 申报界面,它的梅托德数据,您需要发送到活动作为参数

    public interface Callback { 
        void onDataPicked(Data data); 
    } 
    
  2. 你的活动应该实现此接口。在经过重写的方法中编写自己的代码。例如:

    @Override 
        public void onDataPicked(Data data) { 
        Intent intent = new Intent(this, AnotherActivity.class); 
        intent.putExtra("some_data", data); 
        startActivity(intent); 
    } 
    
  3. 声明回调实例并获得链接,在片段的onAttach方法主办的活动。

    private Callback mCallback; 
    
    @Override 
    public void onAttach(Context context) { 
        super.onAttach(context); 
        if(context instanceof Callback){ 
         mCallback = (Callback) context; 
        } 
    } 
    
  4. Finnaly,当你的数据准备好打电话Calback实例的方法,蚂蚁将在活动运行

    @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()); 
         } 
        }); 
    } 
    
  5. 不要忘记设置mCallback在onDetach为空()的片段的方法以避免内存泄漏

    @Override 
    public void onDetach() { 
        super.onDetach(); 
        mCallback = null; 
    } 
    
+1

我会尽快尝试。非常感谢 –

相关问题