自定义对话框和活动之间有什么区别,因为对话框意味着“Theme.Dialog”?

时间:2013-04-18 07:00:42

标签: android android-listview android-activity

这里我的问题是自定义对话框和活动之间真正的区别是什么,我将其主题作为对话框打开并作为对话框打开, 我已经使用了这两个,我理解的一些小差异是遵循

  1. 编码保留在活动中的其他文件中以及自定义对话框中的同一文件中(如果我们没有为对话框创建新的类文件),
  2. 活动停留在活动堆栈中,而对话框不在。
  3. 还有其他区别吗?所以我们需要自定义对话框代替活动作为对话,反之亦然,

    我当前的问题是当我点击listitem并打开新活动(此处为对话框),当我按下后退按钮并再次单击项目时“意外停止”,并且无法理解错误,我的错误是如下

    04-18 12:21:18.945: E/AndroidRuntime(915): FATAL EXCEPTION: main
    04-18 12:21:18.945: E/AndroidRuntime(915): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131230777, class android.widget.ListView) with Adapter(class com.logicbridge.lazyloader.MyOrdersLazyAdapter)]
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.widget.ListView.layoutChildren(ListView.java:1538)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.widget.AbsListView$CheckForTap.run(AbsListView.java:2728)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.os.Handler.handleCallback(Handler.java:605)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.os.Handler.dispatchMessage(Handler.java:92)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.os.Looper.loop(Looper.java:137)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at android.app.ActivityThread.main(ActivityThread.java:4424)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at java.lang.reflect.Method.invokeNative(Native Method)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at java.lang.reflect.Method.invoke(Method.java:511)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    04-18 12:21:18.945: E/AndroidRuntime(915):  at dalvik.system.NativeStart.main(Native Method)
    

    我的代码适用于listview

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_order_list);
            initControls();
            loadList();
        }
    
        private void initControls() {
            progress = new ProgressDialog(this);
            progress.setMessage("Loading...");
            list = (ListView) findViewById(R.id.my_order_List);
    
        }
    
        private void loadList() {
            StaticItems.myorderadapter = new MyOrdersLazyAdapter(MyOrders.this,
                    StaticItems.myOrderListArr);
            list.setAdapter(StaticItems.myorderadapter);
            list.setOnItemLongClickListener(new OnItemLongClickListener() {
    
                @Override
                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    // Starts new activity after some process
                    ArrayList<String> str = new ArrayList<String>();
                    str.add("loadOrdersDetail");
                    str.add("2");
                    new MyTask(str).execute();
                    return false;
                }
            });
        }
    

    这是否因为我使用了新活动而不是对话?

2 个答案:

答案 0 :(得分:7)

DialogActivity完全不同。例如,服务或广播接收器可以启动Activity,但无法启动Dialog。通常,Dialog属于ActivityActivity控制Dialog的生命周期(即:创建,显示,解散等)。 注意:您可以拥有不属于Dialog的{​​{1}},但这是一种特殊情况。

有时,您希望向用户显示看似Activity的内容,但您需要使用Dialog。一个很好的例子是Activity。有时,当用户从通知栏中选择Notification时,您希望向他显示Notification。但是,您无法从Dialog开始Dialog。相反,您使用的是使用Notification的{​​{1}}。 Activity的行为类似于Theme.Dialog,但对于用户,它看起来像Activity (即:它不占用整个屏幕,它具有透明背景,以便用户可以看到它下面的Activity等。)

答案 1 :(得分:1)

当在后台线程中更改适配器的数据列表并要求更新listview导致此崩溃时,会发生异常。

你可以在MyTask AsyncTask中发布你想要做什么,这可能有助于确定崩溃的原因。?