2016-04-20 7 views
0

私のアプリケーションに親フラグメントとダイアログフラグメントがあります。クリックすると親フラグメントがダイアログフラグメントを開きます。これは私のParentFragmentクラスです。getTargetFragment return Null

public class ParentFragment extends Fragment { 
........ 
........ 
    public class ButtonClickListener implements View.OnClickListener{ 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
      if (prev != null) { 
       ft.remove(prev); 
      } 
      MyDialogFragment newFragment = new MyDialogFragment(); 
      newFragment.setTargetFragment(ParentFragment.this, 0); 
      newFragment.show(getFragmentManager(), "dialog"); 
     } 
    } 

} 

これはMyDialogFragmentクラスでgetTargetFragmentは常にnullを返した場合MyDialogFragmentクラス

public class MyDialogFragment extends DialogFragment { 
.......... 
public MyDialogFragment() { 
      parentFragment = (ParentFragment)getTargetFragment(); 

     } 
........... 
........... 
} 

です。

+0

「getFragmentManager()。findFragmentByTag(parentFragmentTag);」のようにindFragmentByTagを使ってみてください。 –

答えて

2

は、あなたが最初に新しいMyDialogFragmentオブジェクトを作成するコマンドここ

MyDialogFragment newFragment = new MyDialogFragment(); // line 1 
newFragment.setTargetFragment(ParentFragment.this, 0); // line 2 

のあなたの順序を確認してください。このコマンド(行1)がMyDialogFragmentのコンストラクターを呼び出すことを忘れないでください。その後、ターゲットフラグメントを設定しています(2行目)。

あなたは、あなたのdialogFragment見

public MyDialogFragment() { 
      parentFragment = (ParentFragment)getTargetFragment();  
} 

場合は、コンストラクタでターゲットフラグメントにアクセスしようとしています。 ターゲットフラグメントは、コンストラクタが2行目で呼び出された後にアセンブルしているため、常にnullになります。他のメソッドからアクセスしたり、コンストラクタにパラメータとして渡したりしてください。

0

getTargetFragment()がnullであるため、ParentFragmentへの参照がありませんが、FragmentManagerのgetFragmentById()メソッドまたはgetFragmentByTag()メソッドを使用して他の方法でFragmentを取得できます。引数には、ダイアログの断片に設定する引数ですsetTargetFragment()、後ろにある

parentFragment.getFragmentManager().putFragment(args, "bla bla tag", (Fragment)parentfragment); 

0

setTargetFragment()とgetTargetFragmentは、シンプルなゲッターとセッターではありません、彼らはのような呼び出しを置き換えます。 getTargetFragmentの背後にある

getFragmentManager().getFragment(getArguments(), "bla bla tag"); 

()。見て分かるように、このロジックには、変数を設定して取得するだけでなく、フラグメントライフサイクルも含まれます。

要するに、ターゲットフラグメントを取得したい場合は、onCreateDialog()またはonCreate()のDialogFragmentのメソッドで引数をすでに設定しているので、getTargetFragment()をnullにすることはできません。 :)