我想知道我的代码有什么问题,或者我的代码中缺少什么。这是我的情景:
我有一个ListView和一个CustomAdapter,用于从BaseAdapter派生的数据。
我为每个项目制作了自定义视图。
在这个自定义视图(又称单元格)中,我应用了longClickListener。在按下单元格很长时间后,成功调用长按方法。直到这里没问题。
但是当我在此方法中添加用于生成AlertDialog的代码时,AlterDialog将永远不会生成并崩溃整个应用程序。
我尝试在类中创建另一个方法,该方法现在包含alertDialog生成。然后我从longClickListener的接口方法调用这个外部方法。但仍然是同样的崩溃。
然后我尝试通过Runnable创建整个alertDialog并在1秒后通过Handler启动Runnable,但仍然生成alertDialog并导致应用程序崩溃。
以下是现在的代码:
void called()
{
Handler h = new Handler();
Runnable r = new Runnable(){
@Override
public void run()
{
Log.d("mx", "about to run!");
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(FolderCell.this.getContext());
alertDialogBuilder
.setTitle("title")
.setMessage("message")
.setCancelable(false)
.setNegativeButton("OK",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
};
h.postDelayed(r, 1000);
}
@Override
public boolean onLongClick(View arg0) {
// TODO Auto-generated method stub
Log.d("mx", "Long clicked!");
this.called();
return true;
}
崩溃日志:
08-23 23:40:39.734: E/AndroidRuntime(32390): FATAL EXCEPTION: main
08-23 23:40:39.734: E/AndroidRuntime(32390): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.ViewRootImpl.setView(ViewRootImpl.java:589)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.app.Dialog.show(Dialog.java:277)
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.rdmteq.pic_measure.FolderCell$2.run(FolderCell.java:216)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Handler.handleCallback(Handler.java:615)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Looper.loop(Looper.java:137)
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.app.ActivityThread.main(ActivityThread.java:4794)
08-23 23:40:39.734: E/AndroidRuntime(32390): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 23:40:39.734: E/AndroidRuntime(32390): at java.lang.reflect.Method.invoke(Method.java:511)
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
08-23 23:40:39.734: E/AndroidRuntime(32390): at dalvik.system.NativeStart.main(Native Method)
有关FolderCell在层次结构中的位置的其他信息
MainActivity (Activity Class)
|
contains--> ListView (ListView Class)
|
--> CustomAdapter (BaseAdapter Class) and set to ListView
|
contains-> FolderCell (RelativeLayout Class) generated in getView(..)
任何人都可以帮我吗?
答案 0 :(得分:0)
您可以尝试使用FolderCell.this
代替FolderCell.this.getContext()
并检查这是否适用于主线程。
答案 1 :(得分:0)
您正试图从不是UI线程的线程中显示AlertDialog
。
要做你想做的事,你必须使用Handler
或AsyncTask
(在AlertDialog
方法上显示onPostExecute()
。在我看来,{{ 1}}方式更容易。