zoukankan      html  css  js  c++  java
  • 练习PopupWindow弹出框之实现界面加载的时候显示弹出框到指定的view下面--两种延迟方法

    今天在练习PopupWindow弹出框的时候,打算在界面加载的时候将弹出框展现出来并显示在指定的view下面。

    初步方法是直接在OnResume方法里面直接执行showPopupWindows方法。

    但是报“Unable to add window -- token null is not valid; is your activity running?”

    原因参考:http://cb269267.iteye.com/blog/1787779

    总结下原因如下:popupwindow必须要指定一个view,如果这个view还没有创建显示出来,那么就会报这种错误。

    解决思路是:延迟一段时间再执行showPopupWindows方法。上面的链接里面就是这个思路。

    方法一:直接使用Handle延迟

    public void onResume() {
        super.onResume();        
        //方式一:直接使用Handle延迟
        Message msg = popHandler.obtainMessage();
        msg.what = 0;//message的what值
        msg.arg1 = 0;//选项卡的下标值,用于匹配popupwindow的背景图片数组中的下标值
        msg.obj = toptab_Items.get(0);//第一个选项卡的view实例
        popHandler.sendMessageDelayed(msg, 500);
    }
    private Handler popHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                
                switch (msg.what) {
                case 0:
                    
                    View view = (View) msg.obj;//选项卡的实例对象
                    int index = msg.arg1;//选项卡的下标值,用于匹配popupwindow的背景图片数组中的下标值
                    showPopupWindows(view,index);
                    break;
    
                default:
                    break;
                }
            }
        };


    方法二:通过子线程延迟

    public void onResume() {
            super.onResume();
            
            //方式二:子线程延迟
            popHandler.post(runnable);
        }
    private Handler popHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                
                switch (msg.what) {
                case 0:
                    
                    View view = (View) msg.obj;//选项卡的实例对象
                    int index = msg.arg1;//选项卡的下标值,用于匹配popupwindow的背景图片数组中的下标值
                    showPopupWindows(view,index);
                    
                    if(timer != null){
                        timer.cancel();
                    }
                    popHandler.removeCallbacks(runnable);
                    
                    break;
    
                default:
                    break;
                }
            }
        };
    private Timer timer;
        
        //创建一个子线程
        private Runnable runnable = new Runnable() {
            
            public void run() {
                try {
                    timer = new Timer();
                    
                    TimerTask task = new TimerTask() {
                        
                        public void run() {
                            Message msg = popHandler.obtainMessage();
                            msg.what = 0;//message的what值
                            msg.arg1 = 0;//选项卡的下标值,用于匹配popupwindow的背景图片数组中的下标值
                            msg.obj = toptab_Items.get(0);//第一个选项卡的view实例
                            popHandler.sendMessage(msg);
                        }
                    };
                    
                    timer.schedule(task, 500);
                    
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        };

    备注:

    /**显示popupWindow弹出框在指定的view下面*/
     private void showPopupWindows(View view, int index){。。。。}

    //显示popupWindow弹出框
        private void showPopupWindows(View view, int index){
            
                    
            if(popupWindow != null){
                if(popupWindow.isShowing()){
                    popupWindow.dismiss();
                }
            }
            
            //一个自定义的布局,作为显示的内容
            View popupWindowView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_popupwindow, null);
            
            //布局文件中的根节点的背景图片
            LinearLayout popupLayout = (LinearLayout) popupWindowView.findViewById(R.id.popupLayout);
            popupLayout.setBackgroundDrawable(getResources().getDrawable(popupBackGrounds[index]));
            
            //修改文本内容
            TextView message_Text = (TextView) popupWindowView.findViewById(R.id.message_Text);
            message_Text.setText(messages[index]);
            
            //按钮的弹出信息
            Button cancle_btn = (Button) popupWindowView.findViewById(R.id.cancle_btn);
            
            cancle_btn.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(getActivity(), "这是一个弹出框", Toast.LENGTH_SHORT).show();
                }
            });
            
            
            //实例化PopupWindow
            popupWindow = new PopupWindow(popupWindowView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            
            popupWindow.setTouchable(true);//设置可以触摸
            
    
            popupWindow.showAsDropDown(view);
            
        }
  • 相关阅读:
    docker知识集锦
    kubernetes知识集锦
    redis知识集锦
    Java多线程知识集锦
    vscode离线安装插件
    jsoncpp的简易教程
    为什么要自动化测试?
    如何选择正确的自动化测试工具
    如何选择测试自动化工具?
    测试自动化的五大挑战
  • 原文地址:https://www.cnblogs.com/whycxb/p/4802787.html
Copyright © 2011-2022 走看看