2016-10-26 6 views
0

私はmain activityを持っていて、基本的に2 fragmentsをホストしています。これらのそれぞれはListViewの行を含んでいます。 OnItemClickListenerは、詳細なデータでDialogFragmentを開きます。フラグメントから対話フラグメント対フラグメントの起動

DialogFragmentボタンがあります。DialogInterface.OnClickListener positiveButtonOnClickListenerこの詳細データで別のフラグメントを起動します。

  1. はそれが正しいDialogFragmentからFragmentを起動しますか?

  2. もしそうでない場合は、DialogFragmentが却下された後、親フラグメントからこのFragmentを起動する必要がありますか?私は起動いけないため、問題がある可能性がありますMainActivityから起動し、(私はこのケースでは2つの断片を持っており、それらのいずれかが親になることができます)

  3. または私はMainActivityからそれを起動する必要があります。(しかし、私のDialogFragmentMainActivityからとMainActivityは、断片のArrayAdapterがデータを持っている、データを持っていません。

+0

あなたが 'DialogFragment'から' Fragment'を起動していると言うと、 'Fragment'がダイアログの一部であるか、別の' DialogFragment'が表示されていますか? – SimonH

+0

@SimonH、それはダイアログの一部ではなく、別個の断片です。 – user1324887

答えて

0

Fragment株式ActivityFragmentManagerので、そのOK getFragmentManager()メソッドを使用してDialogFragmentから新しいFragmentを起動する

0

基本的にDialogFragmentを含むすべてのフラグメントは、Activityから起動し、管理することをお勧めします。Fragmentは必然的にコンテキストを必要としますが、コンテキストはActivityからのみ与えられます。

contextそれ自体は必要ありませんFragmentを起動するが、我々はcontextを必要getStringまたはリソースに依存するコードを使用するように私は必然的にを言いました。

あなたの質問には、作成するのは難しいですが、#3を実装することをお勧めします。

ArrayAdapterのデータの場合、2つのオプションがあります。

  1. 任意のビューからアクセスするには、データレイヤーを再設計します。リポジトリパターンまたはFluxパターンは、アプリをリファクタリングするのに役立ちます。

  2. #2の方法で実装します。 DialogFragmentを処理するのが最も簡単で効率的な方法です。 をできるだけ近くでActivityから操作することは良いことです。そうでなければ、ChildFragmentManagerは別の頭痛を起こすでしょう。

#1は行くことが最も簡単ですが、タブの内側に、それはゴミを収集するので、目に見えないことができることを意味します。

+0

私はフラグメントの断片を起動していないことについて多くのポストを見てきましたが、具体的な理由もなく、Google I/O 2016も反対を示唆しているようです。 – user1324887

+0

@ user1324887 //フラグメントから子フラグメントを管理しない主な理由は、この図が示すように、超複雑なActivity-Fragmentライフサイクルのためです。 https://github.com/xxv/android-lifecycle Google I/Oは、それぞれの具体的な要件と実装ではなく、実践とデモのためのものです。 Androidでもっと多くのコードを書くときは、フラグメントサンドイッチをもっと細かく簡単にして、たくさんのクラッシュや厄介な回避策を生み出すことができます。 – Youngjae

+0

'Fragments'をもっと細くてシンプルにすることにはまったく同意します。しかし、 'Fragment'のコンテキストを取得するのは簡単です。 ' fragmentView = inflater.inflate(R.layout.fragment_component_picker、container、false); '' fragmentView.getContext() ' – SimonH

0

このダイアログは、Fragmentが含まれており、また、ダイアログ上の断片のための別のDialogFragment

public class MyDialogFragment extends DialogFragment implements 
      MyFragmentOnTheDialog.MyFragmentOnTheDialogListener, 
      MyAdditionalPopupDialogFragment.MyAdditionalPopupDialogFragmentListener 
    { 

をポップアップDialogFragmentの骨格例であり、それが動的に追加されます。

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     // fragment dynamically added 
     mFragmentManager = getChildFragmentManager(); 

     // create a new instance of the fragment. 
     mMyFragmentOnTheDialog= MyFragmentOnTheDialog.newInstance(); 

     // Add the fragment to the layout by replacing a frame on the layout 
     FragmentTransaction transaction = mFragmentManager.beginTransaction(); 
     transaction.replace(R.id.frame_my_fragment, mMyFragmentOnTheDialog); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
     } 

ポップアップ追加DialogFragment MyAdditionalPopupDialogFragmentについては...

btnPick.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction ft = mFragmentManager.beginTransaction(); 
      MyAdditionalPopupDialogFragment frag = MyAdditionalPopupDialogFragment.newInstance(); 
        // pass to the Dialog Fragment a reference to this container class 
        // in order to set up the interface between this fragment and that fragment. 
        // The reference to the MyAdditionalPopupDialogFragment is returned to 'frag' 
        frag.setMyAdditionalPopupDialogFragmentListener(EventAddFragment.this); 
        frag.show(ft, frag.TAG); 

     } 
    }); 

(あなたがコールバックを設定するには、あなたの他のDialogFragmentでsetMyAdditionalPopupDialogFragmentListenerを追加する必要があります)

/** 
* Sets the listener interface with the container class to allow a callback to be made from this 
* fragment. The container class must implement the interface 
* @param listener The container class that has implemented the MyAdditionalPopupDialogFragment interface 
* @return A reference to this fragment 
*/ 
public MyAdditionalPopupDialogFragment setMyAdditionalPopupDialogFragmentListener(MyAdditionalPopupDialogFragmentListener listener) { 
    mListener = listener; 
    return this; 
} 

再。ヤンジェの答え - contextの問題はありません。

+0

はい。もちろん、Fragmentを呼び出すことは、コンテキストそのものである必要はありません。私たちは、 'context'を必要とする' getString'やリソース依存のコードを使用するので、私は言いました。フラグメントのコードは、アプリケーション開発の「コンテキスト」から独立しているとはほとんど想像もしません。 – Youngjae

+0

投稿していただきありがとうございます。私はまた、それがどのように行われたかを知るよりも、正しい/推奨される方法が何であるかを知ることにも興味があります。 (なぜそれが推奨される方法なのかを教えてください)、また、ダイアログの外にある別の断片です。 – user1324887

+0

私の補足的な答えは、それがコースの馬だということです。私はGoogleから "これは正しい"方法 "または"それはこの方法ではない "と言っている教説を読んだことはありません。 'DialogFragment'から' Fragment'を起動することで、あなたがしたいことを実行することは可能で簡単です。それがあなたのやりたいことなのかどうかは、あなたの個人的な、あるいは会社の政策の選択です。私の時間を無駄にして、あなたに詳細を教えてくれて謝ります。 – SimonH

関連する問題