2016-11-24 80 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

我會盡快嘗試。非常感謝 –

相關問題