0

我想知道我的代码有什么问题,或者我的代码中缺少什么。这是我的场景:

对于从 BaseAdapter 派生的数据,我有一个 ListView 和一个 CustomAdapter。

我为每个项目制作了一个自定义视图。

在这个自定义视图(也就是单元格)中,我应用了 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(..) 

谁能帮我这个 ?

4

2 回答 2

0

您正在尝试显示AlertDialog来自不是 UI 线程的线程。

要做你想做的事,你必须使用 aHandler或 an AsyncTask(show the AlertDialogon the onPostExecute()method。在我看来,这种AsyncTask方式更容易。

于 2013-08-23T19:02:46.957 回答
0

您可以尝试使用FolderCell.this代替FolderCell.this.getContext() 并检查这是否可以在主线程中工作。

于 2013-08-23T18:22:48.520 回答