从非活动完成活动

问题描述:

我正在开发一个应用程序。我想从第一个活动中调用一个警告对话框。警报对话框被写入另一个非活动类的类中。应用程序的需要是调用活动应该从写在非活动类中的警报完成。调用警报的代码如下。从非活动完成活动

调用从1日的活动警报:

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 

代替:

Utility.callAlert(message, getApplicationContext()); 

使用:

Utility.callAlert(message, Activity1.this); 

public void onClick(DialogInterface dialog, int which) { 
       ((Activity)context).finish(); 
} 

在活动,创建一个新班级

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

,并从对话框类称之为

YourActivityName.finishThisActivity(); 

,或者尝试

YourActivityName.finish(); 
+0

这不起作用。你得到一个错误非静态方法完成不能从静态上下文引用 – 2016-02-12 03:10:25

试试这个:的

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(); 
    } 
} 
+0

@Manoj Fegde工作吗? – KunalK 2013-02-25 12:04:30

+0

没有它没有工作。由于它给出错误,因为:无法对类型活动的非静态方法typr()进行静态引用。 – 2013-02-25 12:08:01

+0

同样的错误? – KunalK 2013-02-25 12:10:02

试试这个,你是不是创造Dialog

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context).create(); 

我想我知道你的答案,因为我已经做过一次自己。这是我的代码,它运作良好!

((Activity)context)可用于调用您的Activity。

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! 
} 

希望它可以帮助你!