2017-12-18 11 views
4

(重複した)質問と回答がありますが、ほとんどすべてを通過して失敗しました。 thisの質問を参考に、私は最近いくつかの変更を加えました。Listen DialogFragment ViewPagerのイベントを却下します。フラグメント

概要:私のアプリでは、MainActivityはフラグメントビューポケットベルとFrangmentA、BとCを保持しています.FrangmentAはDialogFragment CDialog onClikを表示します。 CDialogを終了した後、ここでは起こっていないFragmentAのdoReload()を呼び出す必要があります。

MainActivity

protected void onCreate(Bundle savedInstanceState){ 
          ... 

      mSectionsPageAdapter = new FragmentAdapter(getSupportFragmentManager()); 
      mViewPager = (ViewPager) findViewById(R.id.container); 
      setupViewPager(mViewPager); 
      TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
      tabLayout.setupWithViewPager(mViewPager); 
      int defaultValue = 0; 
      int page = getIntent().getIntExtra("One", defaultValue); 
      mViewPager.setCurrentItem(page); 
    } 

    private void setupViewPager(ViewPager viewPager) 
     { 
      FragmentAdapter adapter = new 
      FragmentAdapter(getSupportFragmentManager()); 
      adapter.addFragment(new FragmentA(), "FragA"); 
      adapter.addFragment(new FragmentB(), "FragB"); 
      adapter.addFragment(new FragmentC(), "FragC"); 
      viewPager.setAdapter(adapter); 
     } 

FragmentA

public class FragmentA extends Fragment implements CDialog.Dismissed{ 
    @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    ... 
    button.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        FragmentManager fm = getActivity().getFragmentManager(); 
        DialogFragment f = new CDialog(); 
        f.show(fm, "CDialog"); 
        } 
      }); 

@Override 
    public void dialogDismissed() { 
     Log.e(DFD_1, "dialogDismiss Called");// <-- This is not working* 
     doReload(); 
    } 
    } 

そしてCDialogue

public class CDialog extends DialogFragment{ 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
            .... 
         return v; 
    } 
    @Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
      ... 

      dfd_1.setOnClickListener(
      new View.OnClickListener() { 
       public void onClick(View v) { 
         getDialog().dismiss(); //<--when this happens* 
        } 
      }); 

} 
    @Override 
     public void onDismiss(DialogInterface dialog) { 
      if (getActivity() != null && getActivity() instanceof Dismissed) { 
       ((Dismissed) getActivity()).dialogDismissed(); 
      } 
      super.onDismiss(dialog); 
     } 

     public interface Dismissed { 
      public void dialogDismissed(); //<-- FragmentA implements this 
     } 
} 
+1

CDialogのonDismiss()では、あなたのアクティビティではなくあなたのフラグメントAを終了させるコールバックを引き起こしているようです。したがって、doReloadを呼び出すフラグメントへの参照を取得するか、アクティビティがフラグメントAのdoReleaodメソッドを呼び出すようにします。 – Luksprog

答えて

3

あなたはいつも断片自体への直接のコールバックを持つことができます。

まずステップ、setTargetFragment()を使用してtargetFragmentを設定することです:

DialogFragment#setTargetFragment(Fragment fragment, int requestCode); 

私はそれをこのように実行します。その後、

public void showDialogFragment(Fragment targetFragment, AppCompatDialogFragment appCompatDialogFragment, int requestCode) { 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    appCompatDialogFragment.setTargetFragment(targetFragment, requestCode); 
    fragmentTransaction.add(appCompatDialogFragment, appCompatDialogFragment.getClass().getSimpleName()); 
    fragmentTransaction.commitAllowingStateLoss(); 
} 

としてダイアログの断片を開くには、このメソッドを呼び出します。

public static final int RC_CDIALOG = 111; 

button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       showDialogFragment(FragmentA.this, new CDialog(), RC_CDIALOG); 
      } 
     }); 

あなたのDialogFragmentのonDismissListener()には、いくつかのコードがありますあなたの標的断片は、その参照あなたが持っている包み使用することができます「FragmentA」であるということを伝えるとともに、

表示ダイアログフラグメント「はCDialog」:E以下のように:あなたはこの方法はやった

@Override 
public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 

    if (getTargetFragment() instanceof FragmentA) 
     ((FragmentA) getTargetFragment()).doReload(); 

} 

それと何か関係があります。あなたのケースでは、あなたがコールしなければならなかったdoReload();

関連する問題