2017-02-22 21 views
1

引数をカスタムダイアログのフラグメントに渡す必要がある場合は、実際に使用する前にそれをバンドルする必要があります。ダイアログフラグメントにデータを渡す方法

例:

class MyDFrag extends DialogFragment{ 

     //Empty Construct 
     public MyDFrag(){} 

     public static MyDFrag newInstance(){ 

      MyDFrag fragment = new MyDFrag(); 
      args = new Bundle(); 
      fragment.setArgument(args); 

     } 

} 

これは、ほとんどのパスのための素晴らしい作品ができますが、実際には、ダイアログの断片を表示する前にこの引数を渡す場合にのみ。

私の問題は、ダイアログにテキストビューがあり、ダイアログが現在表示されている間に親アクティビティで何かが起きたときにその値を変更したいということです。

ダイアログを表示した後に引数を渡しても、この変更は反映されません。私のonCreateで

:ダイアログクラスで

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    textbox = (TextView) view.findViewById(R.id.textish); 

    if(args.containsKey("status")){ 
     textbox.setText(getArguments().getString("status")); 
    } 

} 

は、私はその後、いくつかの点で私のメインの活動に呼び出すのTextViewの値を設定し、公開ダイアログを持っています。私は私の主な活動の準備ができていたとき、私は、ダイアログを表示する前にいないその上映しながらコードを実行した場合

public void setStatus(String value){ 
    args.putString("status", value); 
} 

だから、私はこの作品だけ

dialog.setStatus("ok"); 

を呼び出します。これを達成する方法はありますか?

提案が、私はこれを行うには、いくつかの方法があると信じて感謝

+0

提案みんなのおかげで、彼らはMainFragmentからブロードキャストを送信し、ダイアログでそれを受け取るために、すべての有用 – Tajinere

+0

使用LocalBroadcastManager https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html をWHERE断片 –

答えて

0
public void setStatus(String value){ 

    if(textbox!=null){ 
     textbox.setText(value); 
    }else{ 
     args.putString("status", value); 
    } 

} 
1

を高く評価しています。 基本的には、私が見ているように、ダイアログに非同期的にメッセージを送信して、何かが変更され、UIの更新が必要であることが必要です。 LocalBroadcastManagerの使用を検討してみることをお勧めします。https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

これは設定が簡単ではありません。それらを使用する方法の多くの例を 見つけることができます。 私はそれが作成または表示されるとき、ダイアログで受信機をセットアップします。 親アクティビティで、変更のダイアログに通知する必要があるときは、データを含むメッセージを発信します。

0

あなたが投稿したものから、argsに変更があったときにコードが検出されないため、変更を設定するためにargsから再度読み取られることはありません。

しかし、あなたのやっていることが一度だけ読まれたら、最初はargsを設定するのは無意味ですが、代わりにsetStatusメソッドのテキストを直接設定することをお勧めします(コードフォーマットを動作させることはできません右何らかの理由)のために:

public void setStatus(String value){ textbox.setText(value); }

代わりに文字列リソースを使用して、コードが直面しているユーザーはハードコードしてはならないことに注意してください。

+0

はこのアプリをクラッシュさせませんか? – Tajinere

+0

ダイアログとテキストボックスの両方がnullでない限り、これはクラッシュしません。テキストボックスを初期化し、nullに設定するコードがないので、ダイアログが表示されている限り問題はないはずです。 (ダイアログが実際にあなたが期待している状態にあることを確認してください。もしあなたが確かめたいのなら、(stuff!= null)があなたの友人であるかどうか) – Syzygy

関連する問題