2013-02-25 2 views
3

Я разрабатываю приложение. Я хочу вызвать диалоговое окно предупреждения из 1-го действия. Диалоговое окно оповещения записывается в другом классе, который является классом неактивности. Необходимость приложения заключается в том, что вызывающая деятельность должна заканчиваться из предупреждения, которое написано в классе неактивности. Код вызова предупреждения приведен ниже.завершение деятельности от неактивности

Вызов предупреждения от 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 

ответ

6

вместо:

Utility.callAlert(message, getApplicationContext()); 

использование:

Utility.callAlert(message, Activity1.this); 

и

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

В деятельность, создать новый класс

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

и вызвать его из диалогового класса

YourActivityName.finishThisActivity(); 

или попробовать

YourActivityName.finish(); 
+0

это не работает. Вы получаете сообщение об ошибке Нестационарный метод не может ссылаться на статический контекст –

1

попробовать это:

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

+0

Нет, его не работает. Поскольку он дает ошибку как: не может сделать статическую ссылку на non-staticmethod typr finish() из активности типа. –

+0

Такая же ошибка? – KunalK

0

Попробуйте это, Вы не создаете Dialog

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

Я думаю, я знаю ответ на свой вопрос, потому что я сделал это сам один раз. Вот мой код, и он работает хорошо!

((Активность) контекст) можно использовать для вызова вашей деятельности.

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)context).runOnUiThread() { 
    //Your stuff here! 
} 

Надеюсь, это поможет вам!