11

AlertDialogManagerクラスを介してnon-activityクラスDeviceAdminReceiverSampleのメソッドに警告ダイアログを表示したいのですが、そのメソッドを介してonDisabled呼び出すたびにalertDialog、次のテキストでエラーが生成されます

エラー

06-12 12:01:19.923: E/AndroidRuntime(468): FATAL EXCEPTION: main
06-12 12:01:19.923: E/AndroidRuntime(468): java.lang.RuntimeException: Unable to start           
receiver com.android.remotewipedata.DeviceAdminReceiverSample:   
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not   
for an application

私は問題がcontext物事にあることを知っていますが、それが機能するようにそこに何を置くべきかわかりません。試してみましthisgetApplicationContext()が、すべて無駄です。両方のクラスの私のコードは以下のとおりです

AlertDialogManager

public class AlertDialogManager {

public void showAlertDialog(Context context, String title, String message,
        Boolean status) {
    final AlertDialog alertDialog = new AlertDialog.Builder(context).create();
    alertDialog.setTitle(title);
    alertDialog.setMessage(message);

    if (status != null)
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                alertDialog.dismiss();
            }
        });
    alertDialog.show();
}

}

DeviceAdminReceiverSample

public class DeviceAdminReceiverSample extends DeviceAdminReceiver {
static final String TAG = "DeviceAdminReceiver";
AlertDialogManager alert = new AlertDialogManager();

/** Called when this application is no longer the device administrator. */
@Override
public void onDisabled(Context context, Intent intent) {
    super.onDisabled(context, intent);
    Toast.makeText(context, R.string.device_admin_disabled,
            Toast.LENGTH_LONG).show();
    // intent.putExtra("dialogMessage", "Device admin has been disabled");
    // intent.setClass(context, DialogActivity.class);
    // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // context.startActivity(intent);
    alert.showAlertDialog(context, "Alert",
            "Device admin has been disabled", true);
}
4

7 に答える 7

42

これをあなたの前に追加するだけですalertDialog.show();

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

または、上記が機能しない場合は、次のことを試してください。

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL); 

この許可を使用します。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
于 2015-07-04T14:18:48.657 に答える
13

問題は ' You can show AlertDialogs from Activity only' です。これは文脈の問題ではありません。

これはレシーバーからダイアログを表示するのは良い考えではありませんが(通知を使用する方が良い)、しかし、そうしたい場合は、アクティビティをダイアログとして作成して表示することができます

于 2013-06-12T07:10:56.240 に答える
1

アクティビティ クラスでこのメソッドを呼び出す

public static void showAlert(Activity activity, String message) {

        TextView title = new TextView(activity);
        title.setText("Title");
        title.setPadding(10, 10, 10, 10);
        title.setGravity(Gravity.CENTER);
        title.setTextColor(Color.WHITE);
        title.setTextSize(20);

        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        // builder.setTitle("Title");
        builder.setCustomTitle(title);
        // builder.setIcon(R.drawable.alert_36);

        builder.setMessage(message);

        builder.setCancelable(false);
        builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();

            }

        });

        AlertDialog alert = builder.create();
        alert.show();
    }
于 2013-06-12T07:12:57.653 に答える