Fragment いろいろ 終了 データ受け渡し
---1---
Fragmentの終了 finish() の事。
getFragmentManager().beginTransaction().remove(this).commit();//BackStackなし
getFragmentManager().popBackStack();//BackStackあり
---2---
Activity==> Fragment
Bundleを使う
koFragment = new KoFragment();
Bundle bundle = new Bundle();
bundle.putInt("oyaId", oyaId);
koFragment.setArguments(bundle);// フラグメントに渡す値をセット
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.f1, koFragment,"ko");
transaction.addToBackStack(null);
transaction.commit();
---3---
Fragment==> Activityのデータ受け渡し
Activity 内の public void onReturn_KoCall(int oyaId) を呼んでデータを渡す。
MainActivity callingActivity = (MainActivity) getActivity();
callingActivity.onReturn_KoCall(oyaId);////
---4---
Fragment 親 ==> Fragment 子 のデータ受け渡し
これ理解するの大変だった。なんかnewInstanceはjavaの常識を覆す手法だ
-------setTargetfragment(this)が使えなかったので以下の手法をとる。
親側
まず、 newInstanceでデータ受け渡し
その時にthisFragment を取得しておく。
あとで、子 Fragment を呼ぶときに setTargetfragment するときに必要
thisFragmentは、
Fragment inputF= fragmentManager.findFragmentByTag("inputtext");
Fragment nowFragment = fragmentManager.findFragmentById(R.id.f1);
でも取得できる。
private String scrollPos;
private static Fragment thisFragment;
//Fragment お決まりのパターン
// メモリ不足による破棄後からの復帰時にフレームワークがリフレクションで呼びだすコンストラクタ
public OyaFragment() {}
//newInstance データ受け取り Bundleで必ずセット
public static OyaFragment newInstance(String scrollPos) {
OyaFragment f = new OyaFragment();
// 引数を設定
Bundle args = new Bundle();
args.putString("scrollPos", scrollPos);
f.setArguments(args);
thisFragment = f;
return f;
}
次に、子 Fragment を呼ぶ
thisFragment,requestCode,と一緒に各引数をセットして newInstanceを呼ぶ
InputTextFragment inputTextFragment;
String defortText = "無題のメモ帳";
String dialogTitle= "新しいメモ帳を作成します。";
String dialogMsg = "後で変更する事もできます。";
String fromCall = "NewAddFromOya";
inputTextFragment = InputTextFragment.newInstance(thisFragment,requestCode,
defortText,dialogTitle,dialogMsg,fromCall,oyaId);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
//transaction.replace(R.id.f1, inputTextFragment, "inputtext");
transaction.add(R.id.f1, inputTextFragment, "inputtext");
// inputTextFragment.setTargetFragment(MainActivity.getOyaFragment(), 37);
transaction.addToBackStack(null);
transaction.commit();
子側
まず、 newInstanceでデータ受け渡し 親と一緒
違うのは、f.setTargetFragment(fragment, requestCode);で親Fragment とrequestCode をsetTargetFragmentする。
この親Fragmentが、さっき親で取得したthisFragmentなのです。
private int requestCode;
private Fragment target;
private Fragment thisFragment;
// メモリ不足による破棄後からの復帰時にフレームワークがリフレクションで呼びだすコンストラクタ
public InputTextFragment() {}
//newInstance データ受け取り Bundleで必ずセット
public static InputTextFragment newInstance(
Fragment fragment, int requestCode, String defortText, String dialogTitle, String dialogMsg, String fromCall, int oyaId) {
InputTextFragment f = new InputTextFragment();
f.setTargetFragment(fragment, requestCode);
// 引数を設定
Bundle bundle = new Bundle();
bundle.putString("defortText", defortText);
bundle.putString("dialogTitle", dialogTitle);
bundle.putString("dialogMsg", dialogMsg);
bundle.putString("fromCall", fromCall);
bundle.putInt("oyaId", oyaId);
f.setArguments(bundle);
//ragment = f;
//target = fragment;
return f;
}
そしてcreateview などでデータ取得する。targetがさっき親で取得したthisFragment。
target = getTargetFragment();
requestCode = getTargetRequestCode();
Bundle bundle = getArguments();
//String name = bundle.getString("Name");
String defortText = bundle.getString("defortText");
String dialogTitle = bundle.getString("dialogTitle");
String dialogMsg = bundle.getString("dialogMsg");
fromCall = bundle.getString("fromCall");
oyaId= bundle.getInt("oyaId");
さらに、
結果を親に渡す。
wwwを戻す場合、親Fragment の onActivityResult requestcode 37 で受け取る。
Intent result = new Intent();
result.putExtra("www", www);
target.onActivityResult(37, Activity.RESULT_OK, result);
// getFragmentManager().beginTransaction().remove(this).commit();//BackStackなし
getFragmentManager().popBackStack();//BackStackあり