2016-11-24 16 views
0

fragmentstimedate pickerの2つです。 データを結合して別のactivityに送信するには、ユーザーが選択したデータをフラグメントから送信してfragments activityに渡す必要があります。 私はこの解決策Linkを使用しましたが、データはnullです。フラグメントからコンテナアクティビティへの引数の受け渡し

これはFragmentOneある - FramentTwoは、この私の活動である

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; 
     } 
    } 
} 
} 

EDIT

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 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 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(...はい、その後DatePickerActivity

アップデートでは

if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().trim.equals("")){ 

    String dateTimeString = tvDateFrom.getText().toString() + time; 
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString); 
} 

このラインをコールバックを呼び出す場合はい、その後onTimeSetメソッドチェックで

if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().trim.equals("")){ 

    String dateTimeString = date + tvTimeFrom.getText().toString(); 
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString); 
} 

コールバックを呼び出すには時間がすでに選択されている場合)メソッドのチェックは時間すでに選択されています:

public class DatePickerActivity extends AppCompatActivity implements FragmentOne.OnDateTimeSelectedListener{ 


// update inside 

UPDATE:

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オブジェクトとして渡すことができます。アクティビティ内にセーブデータを追加します。値をpickedvalis //

+0

いくつかの例がありますか?ありがとう –

1
Class Activity1 
{ 
private String pickedDateValue; 

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

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

はあなたがフラグメント間interractへのコールバックインターフェースを使用する必要があり、それがホストアクティビティの日付/時刻ピッカー

0

から選びました。たとえば、次のように

  1. インタフェースで宣言し、あなたが、パラメータ

    public interface Callback { 
        void onDataPicked(Data data); 
    } 
    
  2. あなたの活動は、このインタフェースを実装する必要がありますとしての活動に送信する必要があることを、データとmetodています。オーバーライドされたメソッド内に独自のコードを記述します。たとえば:

    @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、それはあなたのフラグメントのonDetach()メソッドにnullにmCallbackを設定することを忘れないでください活動に

    @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. を実行しますCalbackインスタンスのメソッドアリを呼び出しますメモリを避けるためには、

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

私はできるだけ早く試してみます。どうもありがとう –

関連する問題