1

そこにいくつかのUI要素を含むダイアログがあります。このダイアログは作成され、後で を介して表示されshow()ます。デフォルトのコンストラクターでダイアログを作成できますDialog(Context)。しかし、私のコンテンツビューは、関数のonCreate後に呼び出されるものにのみ設定されていshow()ます。これにより、UI 要素を次のように変更しようとすると NPE が発生します。

public void showNumber(String number)
{
    labelNumber.setText(number);
    show();
}

ただし、上記の関数を以下のように変更すると、ほとんどの場合は機能します。setContentView(実行時までに呼び出されないため、電話が遅くなると失敗することがありますsetText

public void showNumber(String number)
{
    show();
    labelNumber.setText(number);
}

ダイアログを作成し、まったく表示せずにコンテンツ ビューを設定するにはどうすればよいですか。手動で呼び出すと、最初のsetContentView()呼び出し時に再度呼び出されます。show()

4

1 に答える 1

3

create();ダイアログを作成するときにダイアログを呼び出すだけです。

show を呼び出すcreate();と、呼び出されていない場合にのみダイアログが作成さonStart();れ、ダイアログが呼び出されます。最後に、ダイアログをウィンドウにアタッチします。

何かのようなもの:

Dialog myDialog = new Dialog(context) {
    protected void onCreate() {
         super.onCreate();
         doYourThing
    }
};
myDialog.create();

Dialog では、サブクラスがオーバーライドする空のメソッドにすぎないため、onCreate でロジックを実行していると想定しています。

onCreate: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/Dialog.java#37

表示: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/Dialog.java#254

API レベル 21 以前 (AlertDialog.Builder を使用できない場合) を使用onRestoreInstanceStateして、次のようにやりたいことを実行できるはずです (これはハックです)。

Bundle myBundle = new Bundle();
myBundle.putBoolean("android:dialogShowing", false);
myBundle.putBundle("android:dialogHierarchy", new Bundle());
myDialog.onRestoreInstanceState(myBundle);

情報:

http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/app/Dialog.java#411

于 2015-08-23T09:00:38.680 に答える