zoukankan      html  css  js  c++  java
  • 安卓Dialog对话框多次显示而闪退的解决办法

    事情是这样子的,我在一个活动中自定义了一个AlertDialog,通过一个按钮点击即可弹出,而后来出现的情况是,第一次点击就没问题,

    正常跳出,而第二次就直接程序闪退,然后报The specified child already has a parent. You must call removeView的错误,

    这是我的AlertDialog的代码,和布局

    final AlertDialog setTheOrder = new AlertDialog.Builder(Passenger.this)
                    .setView(R.layout.order_layout)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    //以下都是这个Dialog布局中的一些控件
                            getLocation("湘潭",startInput.getText().toString(),0);
                            getLocation("湘潭",endInput.getText().toString(),1);
                            startPlace = startInput.getText().toString();
                            endPlace = endInput.getText().toString();
                            startTime = getFormatTime(startTimeInput_h.getText().toString(),startTimeInput_m.getText().toString());
                            endTime = getFormatTime(endTimeInput_h.getText().toString(),endTimeInput_m.getText().toString());
                            supplyCar = getSupplyCar(canSupplyCar.getText().toString());
                           
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            
                        }
                    }).create();
            setTheOrder.show();

    再来看这个错误,字面意思呢,就是说这个特定的child已经有了一个父布局,必须移除这个布局,才能继续你的内容,经过一番查找,一个子类View,要使用必须依赖于父类View,如果要使用子类的View,必须先调用父类的removeView的方法才能保证子类的使用(不知道表述的对不对,错了烦请大佬们指正)

    好了,既然大概的思路有了,我们先得得到一个父类对象,我找到两个解决办法,

    第一

    通过活动的onCreate方法里面setContentView里面那个布局,调用

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.order_layout, null);

    这两个方法得到父类对象,然后使用完这个Dialog之后,调用removeAllViews,在上面AlertDialog的两个button里面的最后,调用这个方法

    final AlertDialog setTheOrder = new AlertDialog.Builder(Passenger.this)
                    .setView(parent)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            getLocation("湘潭",startInput.getText().toString(),0);
                            getLocation("湘潭",endInput.getText().toString(),1);
                            startPlace = startInput.getText().toString();
                            endPlace = endInput.getText().toString();
                            startTime = getFormatTime(startTimeInput_h.getText().toString(),startTimeInput_m.getText().toString());
                            endTime = getFormatTime(endTimeInput_h.getText().toString(),endTimeInput_m.getText().toString());
                            supplyCar = getSupplyCar(canSupplyCar.getText().toString());
                            parent.removeAllViews();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            parent.removeAllViews();
                        }
                    }).create();
            setTheOrder.show();

    我这里是规定了只能点这两个按钮才能结束这个Dialog,其实如果设置了点击Dialog之外的屏幕区域也可以退出Dialog的话,在相应的方法里面也要调用

    第二,报这个错误的原因是因为本来的视图有一个View,而你重新显示的时候,相当于重新给他添加一个View(因为Dialog生成的时候执行了setView这个函数),这时就会报错,所以,粗暴一点的解决办法就是在紧接着Dialog前面将View重新加载,相当于每次都重新生成一个新的对象,这样便不会报错

  • 相关阅读:
    Html转Word文档,解决无法保存网络图片的问题
    Html静态页面获取
    《程序设计基础》(吴文虎)笔记+其他基础细节
    【力扣】21. 合并两个有序链表
    【力扣】448. 找到所有数组中消失的数字
    【力扣】160. 相交链表
    【力扣】155. 最小栈
    【力扣】714. 买卖股票的最佳时机含手续费
    【力扣】309. 最佳买卖股票时机含冷冻期
    【力扣】188. 买卖股票的最佳时机 IV
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9461979.html
Copyright © 2011-2022 走看看