我的设定

我建立了一个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来发出警报时,我没有捕获到异常(吐司没有说“错误!”)。因此,方法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)

最佳答案

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

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

10-08 15:33