2

アクティビティインスタンスを使用するとダイアログを表示できますが、コンテキストまたはアプリケーションコンテキストインスタンスを使用するとダイアログが表示されません。

AlertDialog.Builder builder = new AlertDialog.Builder(activity);
            builder.setTitle(title);
            builder.setMessage(msg);

            if (null != positiveLabel) {
                builder.setPositiveButton(positiveLabel, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                        if (null != listener) {
                            listener.onOk();
                        }
                    }
                });
            }

            if (null != negativeLable) {
                builder.setNegativeButton(negativeLable, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                        if (null != listener) {
                            listener.onCancel();
                        }
                    }
                });
            }

            builder.create().show();

アクティビティインスタンスを使用せずにダイアログを表示するためのソリューションを教えてください

4

4 に答える 4

26

これは、コンテキストについて常に覚えておく必要がある最も重要なことの1つです。コンテキストには2つのタイプがありActivity contextsますApplication contexts。多くのUI関連のクラスで、コンテキストが渡されることがわかります。これはアプリケーションコンテキストではありません!このような場合、常にアクティビティコンテキストを渡す必要があります。を除いて、Toast他のUIコンポーネントはアプリケーションコンテキストで動作しません。

テレフォニーマネージャー、ロケーションマネージャーなど、アプリケーションに関連するサービスまたはコンポーネントが必要な場合は、常にアプリケーションコンテキストが渡されます。

UIの場合、アクティビティであるUI関連のコンテキストを常に渡す必要があります。

于 2012-04-15T03:47:58.743 に答える
7

問題は私が最近直面したことでもあり、アクティビティインスタンスなしでダイアログを作成することはできません。getApplicationContext()呼び出しも機能しません。私がこれを行った方法は、アクティビティからダイアログを作成するメソッドを呼び出し、「this」、つまりそのアクティビティへの参照をパラメーターとして渡すことです。

このコードを再利用可能なコンポーネントとして、または複数の場所でダイアログを作成するメカニズムとして再利用する場合は、基本アクティビティクラスを作成し、そこにこのメソッドを含め、必要に応じてサブクラス化されたアクティビティで使用します。

于 2012-04-15T03:40:03.747 に答える
2

何らかの理由で[少なくともAndroid2.1では]トーストはアプリケーションコンテキストに表示できますが、進行状況ダイアログには表示できません

MyActivity.thisは、クラッシュしないアクティビティ固有のコンテキストです

MyActivity.getApplicationContext()はグローバルであり、プログレスバーをクラッシュさせ、それ以降のバージョンではトーストも行います。

于 2012-09-15T13:15:06.960 に答える
0

コンテキストを使用するには、ダイアログの作成元のアクティビティからコンテキストを渡す必要があります。AlertDialog.Builderそしてこれは、Javaが提供するものを使用する代わりに、独自のダイアログを作成する場合にのみ可能です。これはカスタムのものであり、これを使用してアプリケーションコンテキストを取得します。

public class CustomDialogPopUp extends Dialog implements View.OnClickListener {

public Activity a;
public Context c;
public Dialog d;
//CUSTOMIZE YOUR DIALOG AS YOU LIKE
RecyclerView pointAbsorber;
ImageButton addPoint, attachPoint;
EditText addContent;

//VERY IMPORTANT CONSTRUCTOR THAT WE SHALL USE TO GET THE CONTEXT
public CustomDialogPopUp(@NonNull Context context, Activity a, Context c) {
    super(context);
    this.a = a;
    this.c = c;
}

//INITIALIZING YOUR CUSTOM DIALOG VIEWS AND WHAT NOT. IT NEEDS AN XML FILE BY THE WAY
public void initViewSnActions(){
    pointAbsorber = findViewById(R.id.pointsRV);
    addPoint = findViewById(R.id.addPoint);
    attachPoint = findViewById(R.id.attachPoint);
    addContent = findViewById(R.id.addContent);
    
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.custom_dialog);
    initViewSnActions();
}

//ON CLICK LISTENER FOR YOUR VIEWS
@Override
public void onClick(View v) {
    
}

}

アプリケーションコンテキストを渡すには、次のように表示するクラスでアプリケーションコンテキストを初期化する必要があります。アクティビティコンテキストがどのように渡されるかに注意してください

NotesPopUp notesPopUp = new NotesPopUp(PersistentTest.this, getParent(), getApplicationContext());
notesPopUp.show();
于 2020-07-25T14:31:22.153 に答える