アプリ作って海外移住

コピペプログラマーのメモ

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あり