我已经构建了一个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)
答案 0 :(得分:3)
罪魁祸首似乎是您在Dialog构造函数中传递的getApplicationContext()。而是传递活动参考。
copyAndPaste = new CopyPaste(getApplicationContext()); // wrong way
copyAndPaste = new CopyPaste(refToActivity); //correct way