2016-06-12 13 views
0

フラグメントからViewPagerスライドフラグメントにデータを渡そうとしています。 私の活動は、2分の1に分かれています。 1ボタンリスナーによる入力用のフラグメント。 3フラグメント出力用のスライド。 私がしたいことは、フラグメント(入力)から3つのフラグメントスライド(出力)すべてにデータを渡すことで、計算したデータをスワイプすることができます。フラグメントからビューページにデータを渡す

私は、アクティビティのFragment(入力)からFragmentスライドにデータを渡すためにインターフェイスを使用しようとしました。ボタンリスナーを押してデータを送信すると、アプリケーションがクラッシュします。私はNullPointerExceptionを取得します。

この作業を行うには、どのような方法が一番簡単ですか?私は本当にこの問題に固執しています。

Thx。

+0

コード – PsyGik

答えて

0

私はあなたのFragmentPagerAdapterにヘルパーコードを追加するだけで各フラグメントの参照を保持する必要があると思います。それぞれのフラグメントはインタフェースを実装する必要があります。 instanceがnullと等しくないかどうかを確認する必要があるときはいつでも、インタフェースメソッドを呼び出してデータを渡します。

以下のコードは、フラグメントの参照を保持するのに役立ちます。 https://stackoverflow.com/a/29269509/4901098

+0

を投稿すると、コードをあまりにも多く結合することができます。 – Eenvincible

+0

はい私は設計を考慮しないで迅速な修正を提案していました。 wrtデザインを考える必要がある場合は、ここでオブザーバーパターンを使用するかもしれません。データモデルを使用して、最初のフラグメントで使用されているデータを配置します。このモデルはObservableであり、変化を観察することに関心があるフラグメントはオブザーバになり、それに応じてビューを変更することができます。 –

0

このアプローチを試してみてください:あなたのイベントを表し、通常のJavaクラスを作成し、その後、あなたのmoduleレベルbuild.gradleファイルに

compile 'org.greenrobot:eventbus:3.0.0' 

を次の行を追加します。

public class UpdateFragmentsUIEvent{ 

    //add your values you want to pass to your other fragments 
    private String valueA; 
    private String valueB; 
    private String valueC; 
    //.....others? 

    public UpdateFragmentsUIEvent(){ 
    } 

    //add getters and setters here 
} 

今、あなたはあなたのイベントクラスを作成したので、更新するフラグメント(最初のものではないが、あなたがにデータを渡したいもの)で、次の操作を行います。

public class FragmentB extends Fragment{ 

    @Override 
    public void onAttach(Context context){ 

     super.onAttach(context); 

     //important here - could be done inside onCreate() 
     EventBus.getDefault().register(this); 
    } 

    //very important here as well 
    public void onEvent(UpdateFragmentsUIEvent event){ 
     /* this event instance has all your values here now */ 

     String valueA = event.getValueA(); 
     String valueB = event.getValueB(); 

     /* Now you can update your views accordingly */ 
    } 

    /* don't forget to unregister inside onDestroy */ 
    @Override 
    public void onDestroy(){ 

     super.onDestroy(); 
     EventBus.getDefault().unregister(this); 
    } 
} 

//somewhere when a button is clicked after entering data 
EventBus.getDefault().post(new UpdateFragmentsUIEvent(valueA, valueB, valueC)); 
:あなたが値を入力する場所

最後には、実際にあなたが私が思う最初のフラグメント内で、このように新しく鋳造イベントをポストする必要があり、あなたのフラグメントをされて通知します10

それと同じように、あなたは完了です!インターフェイスについては忘れて、この例で使用されるパブリッシャ/サブスクライバパターンのようなコードの疎結合に続く推奨デザインパターンに固執してください。

私はこれが助けてくれると嬉しく思います。

関連する問題