返回的AlertDialog上的.show()会抛出FATAL EXCEPTION

时间:2014-02-23 03:30:56

标签: android android-alertdialog

我的设置

我已经构建了一个CopyPaste.java类,它允许我使用其中的所有方法来控制复制和粘贴到剪贴板。

我的第一个问题是:

CopyPaste类需要创建一个对话框,以显示给用户选择复制或粘贴。 CopyPaste不是我的Activity类的一部分,因此我无法显示该类的警报。

如果有人为此问题找到解决方法,我会使用它(这是首选)。

但是,为了解决这个问题,我只是在CopyPaste return中创建了AlertDialog创建的方法,然后在我的Activity类中显示它。


代码

我必须创建我的CopyPaste类的实例,因为该类的方法需要Context

所以这就是它的设置方式:

public class CopyPaste {

    private Context c = null;
    public CopyPaste(Context c) {
        this.c = c;
    }
...

要从我的Activity类创建实例,就是这样:

CopyPaste copyAndPaste;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myLayout);

    copyAndPaste = new CopyPaste(getApplicationContext());
    ...

在我的Activity类中,这就是我使用CopyPaste中的方法的方法:

final EditText e = (EditText)findViewById(R.id.editText);
e.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) 
{
    if (e.length() == 0) {
        copyAndPaste .pasteOption(e).show(); // pasteOption returns AlertDialog
    }
}

pasteOption方法是CopyPaste的方法,它返回创建的AlertDialog,如下所示:

public AlertDialog pasteOption(final EditText e) {
    try {
        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setCancelable(true)
        .setNeutralButton("Paste", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                paste(e);
            }
        });
        AlertDialog alert = builder.create();
        //alert.show();
        return alert;

    } catch(Exception q) { 
        q.printStackTrace(); 
        toast("Error!"); 
        return null; 
    }
}

错误

当我长时间点击EditText以显示警报时,我没有捕获的异常(toast没有说“Error!”)。因此,方法pasteOption正确地返回AlertDialog,但错误发生在该行(来自LogCat中CentralTendency.java的第100行):

copyAndPaste.pasteOption(e).show(); // pasteOption returns AlertDialog

就此而言,这是LogCat:

02-22 22:08:53.522: E/AndroidRuntime(12335): FATAL EXCEPTION: main
02-22 22:08:53.522: E/AndroidRuntime(12335): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:800)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.app.Dialog.show(Dialog.java:287)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at com.mikeyaworski.calculator.CentralTendency$3.onLongClick(CentralTendency.java:100)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.view.View.performLongClick(View.java:4525)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.widget.TextView.performLongClick(TextView.java:9575)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.view.View$CheckForLongPress.run(View.java:18775)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.os.Handler.handleCallback(Handler.java:730)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.os.Looper.loop(Looper.java:137)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at android.app.ActivityThread.main(ActivityThread.java:5455)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at java.lang.reflect.Method.invokeNative(Native Method)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at java.lang.reflect.Method.invoke(Method.java:525)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
02-22 22:08:53.522: E/AndroidRuntime(12335):    at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:3)

罪魁祸首似乎是您在Dialog构造函数中传递的getApplicationContext()。而是传递活动参考。

copyAndPaste = new CopyPaste(getApplicationContext()); // wrong way
copyAndPaste = new CopyPaste(refToActivity); //correct way