【问题标题】:Why doubleclick on a custom button crashes an android app为什么双击自定义按钮会使android应用程序崩溃
【发布时间】:2019-05-17 06:00:01
【问题描述】:

我实现了一个自定义按钮并延迟添加了一个任务,以便它显示动画。 当我双击它时,它崩溃了。我想做,所以它只能点击一次。

我试过 setEnabled(false); 我试过 setClickable(false);

我尝试了一个变量来检查按钮是否被点击并禁用它。

public class Login extends AppCompatActivity {

Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    final SubmitButton LoginBtn = findViewById(R.id.login);
    handler = new Handler();
    LoginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LoginBtn.setEnabled(false);
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    LoginBtn.setEnabled(true);
                    Intent startActivity = new Intent(Login.this, Main_page.class);
                    startActivity(startActivity);
                    finish();
                }
            }, 3200);
        }
    });

}
}

正如我所写,我希望如果按钮被点击,它就会变得不可点击。

【问题讨论】:

  • 您将LoginBtn 声明为final,这是否意味着您将无法更改该值?
  • 当我尝试使用 is without final android studio 发送一个错误,它正在访问内部类中的变量并且它必须被声明为 final。
  • 发布堆栈跟踪。
  • 自从我实现了 if 函数,应用程序不再崩溃。虽然现在我可以按我想要的次数多次按下按钮,并且在 3200 毫秒后,许多活动打开,至少可以看到许多动画。我将删除 if 函数并发布堆栈。
  • 2019-05-16 23:28:25.582 1631-1703/? E/AudioFlinger: createRecordTrack_l() initCheck failed -12;没有控制块? 2019-05-16 23:28:25.587 2642-10416/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord 返回错误 -12 2019-05-16 23:28:25.587 2642-10416/com.google。 android.googlequicksearchbox:search E/AudioRecord: AudioFlinger 无法创建记录轨道,状态:-12 2019-05-16 23:28:25.588 2642-10416/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error创建 AudioRecord 实例:初始化检查失败,状态为 -12。

标签: java android


【解决方案1】:

试试这个:

Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    final SubmitButton LoginBtn = findViewById(R.id.login);
    handler = new Handler();
    LoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginBtn.setEnabled(false);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        LoginBtn.setEnabled(true);
                        Intent startActivity = new Intent(Login.this, Main_page.class);
                        startActivity(startActivity);
                        finish();
                    }
                }, 3200);
            }

        });
...

解释: 您的启用/禁用块位于 onClick 侦听器之外,并且位于 onCreate 方法中:这样您仅在创建活动时调用 setEnable() 方法。

但有时 setEnable() 无法在第二个回复here 中解释的快速点击的情况下工作。在这种情况下,您可以使用计时器来检查经过的时间。

顺便说一句,我认为您的应用程序崩溃是因为您没有以正确的方式处理Handler。我建议你也添加:

@Override
protected void onStop(){
    handler.removeCallbacksAndMessages(null);
}

【讨论】:

  • 使用第一块代码解决了崩溃问题,现在我可以多次按下它,但它只打开一个活动,我将添加代码的第二部分以查看如果它完全解决它
  • 我应该在 onClick 方法中添加 onStop 方法
  • 你添加这段代码不是在 onClick 中,而是在外面,在 onCreate 下
  • 我建议你研究一下activity lifecycle,它解释了 Activity 的工作原理。
  • 好的,谢谢你,至少现在它不会崩溃你已经非常有帮助了。我会研究它。
【解决方案2】:

试试……

view.setOnClickListener(null);

...在您的点击事件之后。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2012-07-22
    • 2014-06-27
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多