【问题标题】:Autoclose window popup after some time span. How to do一段时间后自动关闭窗口弹出。怎么做
【发布时间】:2014-04-05 09:01:46
【问题描述】:

我试图在几秒钟后用一些时间计数器自动关闭我膨胀的弹出窗口。我不知道与计数计时器(5 秒)有什么关系。

  LayoutInflater inflater = (LayoutInflater)screen.getSystemService(screen.LAYOUT_INFLATER_SERVICE);
                    layout =  inflater.inflate(R.layout.log_viewer,null);

                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setCancelable(true);
                    builder.setView(layout);

                    AlertDialog alertDialog = builder.create(); 
                    alertDialog.show();

                    Button btn0= (Button)layout.findViewById(R.id.btn0);
                    Button btn1= (Button)layout.findViewById(R.id.btn1);
                    Button btn2= (Button)layout.findViewById(R.id.btn2);
                    btn0.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            Intent i =new Intent(Main_Activity.this,Act.class);
                            startActivity(i);
                            overridePendingTransition(R.anim.animation,R.anim.animation2);
                        }
                    });  
                    btn1.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            Intent i =new Intent(Main_Activity.this,Activity2.class);
                            startActivity(i);
                            overridePendingTransition(R.anim.animation,R.anim.animation2);
                        }
                    });  
                    btn2.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            Intent i =new Intent(Main_Activity.this,Activity1.class);
                            startActivity(i);
                            overridePendingTransition(R.anim.animation,R.anim.animation2);
                        }
                    });  


                    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                    Window window = alertDialog.getWindow();
                    lp.copyFrom(window.getAttributes());

                    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
                    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
                    window.setAttributes(lp);

【问题讨论】:

  • 未来阅读注意事项:OP 没有使用 PopupWindow 而是使用 AlertDialog。

标签: android time popup counter


【解决方案1】:

您是否考虑过将Toast 与自定义布局一起使用?在 Android 上查看 Toast documentation 以开发者网站为例。

或者你可以使用Handler

Handler handler = new Handler();
handler.postDelayed(new Runnable() {

    @Override
    public void run() {
        // close your dialog
        alertDialog.dismiss();
    }

}, 10000); // 10,000 ms delay

【讨论】:

    【解决方案2】:

    像这样扩展你自己的 PopupWindow 窗口类

    public class ToolTipWindow extends PopupWindow implements PopupWindow.OnDismissListener { 
    
        private long closeDelayTime;
        private Handler mHandler;
        private OnDismissListener mOnDismissListener;
    
        public ToolTipWindow(Context context) {
            super(context);
            super.setOnDismissListener(this);
        }
    
        public ToolTipWindow(Context context, long closeDelayTime) {
            this(context);
            this.closeDelayTime = closeDelayTime;
        }
    
        @Override
        public void setOnDismissListener(OnDismissListener onDismissListener) {
            mOnDismissListener = onDismissListener;
        }
    
        //override all show or update method of super class that you use tho call onshow
        @Override
        public void showAtLocation(View parent, int gravity, int x, int y) {
            onShow();
            super.showAtLocation(parent, gravity, x, y);
        }
    
        public void onShow() {
            schedule();
        }
    
        private void schedule() {
            if (closeDelayTime > 0) {
                if (mHandler == null) {
                    mHandler = new Handler();
                }
                mHandler.removeCallbacks(closeRunnable);
                mHandler.postDelayed(closeRunnable, closeDelayTime);
            }
        }
    
        @Override
        public void onDismiss() {
            if (mHandler != null) {
                mHandler.removeCallbacks(closeRunnable);
            }
            if (mOnDismissListener != null) {
                mOnDismissListener.onDismiss();
            }
        }
    
    private Runnable closeRunnable = new Runnable() {
        @Override
        public void run() {
            dismiss();
        }
    };
    
    }
    

    这里我只重写 showAtLocation 方法,如果你使用另一个 PopUpWindow 方法来显示,重写该方法并在其中调用 onShow() 以自动调用调度。

    我在代码中的某个地方调用了 mHandler.removeCallbacks(closeRunnable),调用它非常重要,因为如果寡妇在时间过去之前关闭,它可以避免崩溃。

    【讨论】:

    • 添加 closeRaunnable
    【解决方案3】:

    如果您想在一定延迟后执行某项操作,您可以执行以下操作:

    final long TOTAL_TIME = 5000; // miliseconds
    
    new Handler().postDelayed(new Runnable() {
        public void run() {
            // do action here
        }
    }, TOTAL_TIME);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多