代码之家  ›  专栏  ›  技术社区  ›  Ticherhaz FreePalestine אור מזרחי

使按钮在一定时间内启用和禁用

  •  -1
  • Ticherhaz FreePalestine אור מזרחי  · 技术社区  · 6 年前

    我是安卓工作室的新人。我想做一个聊天应用。 所以,我想在他/她发送消息后再延迟一下。 例如,我输入“hello”,如果我再次发送,它将显示toast to show time,5秒,4秒直到完成。然后我就可以再次发送消息了。

    如果我在这段时间内按下按钮,它将显示能够发送消息的秒数。

    我做了一个,但没有按预期运行。

    private void buttonFabSend() {
            floatingActionButtonSendText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new CountDownTimer( 5000, 1000){
                        @Override
                        public void onTick(long millisUntilFinished) {
                            Toast.makeText(getApplicationContext(),millisUntilFinished/1000 +"seconds",Toast.LENGTH_SHORT ).show();
                            floatingActionButtonSendText.setEnabled(false);
                        }
                        @Override
                        public void onFinish() {
                            editTextInput = findViewById(R.id.editTextChat);
                            if (TextUtils.isEmpty(editTextInput.getText().toString())) {
                                editTextInput.setError("Enter your message");
                                editTextInput.requestFocus();
                                return;
                            }
                            floatingActionButtonSendText.setEnabled(true);
                            FirebaseDatabase.getInstance().getReference().child("chat").push().setValue(new chatMessage(editTextInput.getText().toString(), FirebaseAuth.getInstance().getCurrentUser().getDisplayName(), String.valueOf(FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl())));
                            editTextInput.setText("");
                        }
                    }.start();
                }
            });
        }
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Jawad Zeb    6 年前

    取消对发送消息代码的注释

        int _count = 5;//5 seconds
        private boolean canSendMessage = true;
        private Runnable countDown = new Runnable() {
            @Override
            public void run() {
                while (_count > 0) {
                    _count--;
                    try {
                        Thread.sleep(1000);//1 second
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                _count = 5;//again set to 5 seconds
                canSendMessage = true;//enable send
    
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_upload_test);
    
            final Button send = (Button) findViewById(R.id.send);
            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    if (canSendMessage) {
                        //
    //                    editTextInput = findViewById(R.id.editTextChat);
    //                    if (TextUtils.isEmpty(editTextInput.getText().toString())) {
    //                        editTextInput.setError("Enter your message");
    //                        editTextInput.requestFocus();
    //                        return;
    //                    }
    //                    floatingActionButtonSendText.setEnabled(true);
    //                    FirebaseDatabase.getInstance().getReference().child("chat").push().setValue(new chatMessage(editTextInput.getText().toString(), FirebaseAuth.getInstance().getCurrentUser().getDisplayName(), String.valueOf(FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl())));
    //                    editTextInput.setText("");
                        canSendMessage = false;
                        Thread t = new Thread(countDown);
                        t.start();
                    } else {
                        Toast.makeText(UploadTest.this, "You can send After " + _count + " Seconds", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
    
    
        }
    
        2
  •  1
  •   Gaurav Vashisth    6 年前

    您可以使用如下逻辑:

    private long delay = 4000;
    
    void onViewClick(View view) {
        view.setEnabled(false);
        view.postDelayed(() -> {
            view.setEnabled(true);
        }, delay);
    }
    

    更好的方法是检查延迟后视图是否仍连接到窗口

    private long delay = 4000;
    void onViewClick(View view) {
        view.setEnabled(false);
        view.postDelayed(() -> {
            if (ViewCompat.isAttachedToWindow(view) {
                view.setEnabled(true);
            }
        }, delay);
    }
    
        3
  •  0
  •   Nirav Bhavsar    6 年前

    在您的代码中,每次新的倒计时计时器初始化时,它都不会正常工作,您需要做的是只启动一次倒计时计时器,直到它完成为止。请尝试以下代码

    boolean isRunning = false;
    long currentMillisUntilFinished = 0;
    

    并更换 浮动操作按钮发送文本 click 具有以下代码的事件

    floatingActionButtonSendText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            if (isRunning) {
                Toast.makeText(getApplicationContext(), "seconds remaining: " + currentMillisUntilFinished / 1000, Toast.LENGTH_SHORT).show();
                return;
            }
    
            new CountDownTimer(5000, 1000) {
    
                public void onTick(long millisUntilFinished) {
                    currentMillisUntilFinished = millisUntilFinished;
                    isRunning = true;
    
                }
    
                public void onFinish() {
                    isRunning = false;
                    editTextInput = findViewById(R.id.editTextChat);
                    if (TextUtils.isEmpty(editTextInput.getText().toString())) {
                        editTextInput.setError("Enter your message");
                        editTextInput.requestFocus();
                        return;
                    }
                    FirebaseDatabase.getInstance().getReference().child("chat").push().setValue(new chatMessage(editTextInput.getText().toString(), FirebaseAuth.getInstance().getCurrentUser().getDisplayName(), String.valueOf(FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl())));
                    editTextInput.setText("");
                }
    
            }.start();
        }
    });