7

私はアプリを開発しています。最初のアクティビティからアラートダイアログを呼び出したい。警告ダイアログは、非アクティビティクラスである別のクラスで記述されています。アプリケーションの必要性は、呼び出しアクティビティが非アクティビティクラスで記述されたアラートから終了する必要があることです。アラートを呼び出すコードは次のとおりです。

最初のアクティビティからアラートを呼び出す:

public class Activity1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
    }// End of onCreate.

        /** Back Button. */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            String message = "Do you Want to Exit.";
            Utility.callAlert(message, getApplicationContext());
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }   
}

そして、アラートダイアログを持つ呼び出されたクラスは次のとおりです。

public class Utility {
    // callAlert method to display alert, when exception occur.
    public static void callAlert(String message, final Context context){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
        alertDialogBuilder.setTitle("MyApplication.");
        alertDialogBuilder.setMessage(message);
        alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {                   

            public void onClick(DialogInterface dialog, int which) {
                ((Activity1)context.getApplicationContext()).finish();
            } //end onClick.
        }); // end alertDialog.setButton.
        alertDialogBuilder.show();  
    }
}

しかし、これは私に次のようなエラーを与えます:

02-25 17:00:45.961: D/AndroidRuntime(444): Shutting down VM
02-25 17:00:45.961: W/dalvikvm(444): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-25 17:00:45.971: E/AndroidRuntime(444): FATAL EXCEPTION: main
02-25 17:00:45.971: E/AndroidRuntime(444): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.setView(ViewRoot.java:531)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.Dialog.show(Dialog.java:241)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.xxx.myapp.specialclasses.Utility.callAlert(Utility.java:25)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.xxx.myapp.activities.Activity1.onKeyDown(Activity1.java:149)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.KeyEvent.dispatch(KeyEvent.java:1256)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.os.Looper.loop(Looper.java:123)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-25 17:00:45.971: E/AndroidRuntime(444):  at java.lang.reflect.Method.invokeNative(Native Method)
02-25 17:00:45.971: E/AndroidRuntime(444):  at java.lang.reflect.Method.invoke(Method.java:507)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-25 17:00:45.971: E/AndroidRuntime(444):  at dalvik.system.NativeStart.main(Native Method)
02-25 17:05:46.061: I/Process(444): Sending signal. PID: 444 SIG: 9
4

5 に答える 5

14

それ以外の:

Utility.callAlert(message, getApplicationContext());

使用する:

Utility.callAlert(message, Activity1.this);

public void onClick(DialogInterface dialog, int which) {
                ((Activity)context).finish();
}
于 2013-02-25T11:58:41.630 に答える
3

これを試して:

public class Utility {
  // callAlert method to display alert, when exception occur.
  public static void callAlert(String message, final Activity activity){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
    alertDialogBuilder.setTitle("MyApplication.");
    alertDialogBuilder.setMessage(message);
    alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {                   

        public void onClick(DialogInterface dialog, int which) {
            activity.finish();
        } //end onClick.
    }); // end alertDialog.setButton.
    alertDialogBuilder.show();  
  }
}
于 2013-02-25T11:57:19.347 に答える
2

私は一度自分でやったことがあるので、あなたの答えを知っていると思います。これが私のコードで、うまく機能します!

((Activity)context)を使用して、アクティビティを呼び出すことができます。

NonActivityClass nonActivityClass = new NonActivityClass(YourActivityClass.this);
nonActivityClass.finishIt();

これがNonActivityClassです。

public class NonActivityClass() {
    private Context context;

    public NonActivityClass(Context context) {
        this.context=context;
    }

    public void finishIt() {
        //Remember to import android.app.Activity; in this class!
        ((Activity)context).finish(); //This destroy the your activity class
    }
}

また、非ActivityクラスからUIスレッドを実行するために使用することもできます。例えば、

((Activity)context).runOnUiThread() {
    //Your stuff here!
}

お役に立てば幸いです。

于 2018-02-02T07:50:24.373 に答える
0

これを試してください、あなたは作成していませんDialog

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context).create();
于 2013-02-25T12:01:00.137 に答える
-5

アクティビティで、新しいクラスを作成します

static public void finishThisActivity() {
    finish();
}

ダイアログクラスから呼び出します

YourActivityName.finishThisActivity();

または試してみてください

YourActivityName.finish();
于 2013-02-25T11:57:12.987 に答える