我的设定
我建立了一个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