【问题标题】:Android - Disabled button still workingAndroid - 禁用按钮仍然有效
【发布时间】:2020-04-28 02:44:07
【问题描述】:

我做了一个按钮,它调用了刷新方法:

... android:onClick="refresh"

在方法开始时我设置了这些:

btn.setEnabled(false);
btn.setClickable(false);

最后我将启用和可点击设置为 true。 我的问题是,在程序运行时第一次单击并且按钮被禁用后,我单击按钮例如 3 次。交易结束后,它会自动重新开始 3 次。所以 setEnabled(false) 不起作用。 谁能告诉我为什么? 谢谢。

所以我的布局中只有一个按钮:

<Button        
  android:id="@+id/button1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="50dp"
  android:layout_gravity="center_horizontal"
  android:onClick="refresh"
  android:text="Refresh"
  android:textStyle="bold"

  android:background="@drawable/button"
   />

方法如下:

public void refresh(View view){
    btn.setEnabled(false);
    btn.setClickable(false);

    final double currentLat = lat;
    final double currentLng = lng;

    if(isOnline == true) {
        String link = "http://maps.googleapis.com/maps/api/geocode/json?latlng="+currentLat+","+currentLng+"&sensor=true&language=hu";
        final GetLocation si = (GetLocation) new GetLocation(this, link).execute();

        Runnable runnable = new Runnable() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        Thread.currentThread();

                        try {
                            Thread.sleep(3000);

                            if(si.getAddress() != null) {
                                address.setText(si.getAddress());
                            }                   
                            String date = DateFormat.getDateTimeInstance().format(new Date());
                            String data = date+": ["+currentLat+", "+currentLng+"] - "+si.getAddress()+"\n";

                            FileManagement f = new FileManagement(filename);
                            f.writeToFile(data);

                            btn.setEnabled(true);
                            btn.setClickable(true);

                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });
            }
        };
        new Thread(runnable).start();           
    }
}

【问题讨论】:

  • 当然,我不是 Android 人,但这似乎是一个直截了当的问题。为什么投反对票?
  • 向我们展示更多代码......
  • 更改为 onclicklistener 并请显示更多代码
  • 请向我们展示更多代码,因为我们无法确定您是否禁用了正确的按钮。
  • 阅读here 了解为什么android:onClick 不好。我猜android:onClick 可能会覆盖启用/可点击状态。另外,调试请提供refresh方法。

标签: android button


【解决方案1】:

我的建议是在代码中使用 onClickListener 而不是声明

     android:onClick="refresh"

如果您声明 onClickListener,您将能够在 onClick 事件被拦截时进行记录;)

【讨论】:

  • 为什么可以使用 onClickListener 登录,而不能使用 onClick xml 标签!!?
  • 在onClick 方法中插入log 会给他明确的证据,知道onClick 事件何时被拦截。想到这里是因为他的方法好像在队列中,所以不清楚是什么时候开始的。
  • 你将通过记录方法'刷新'得到相同的结果
【解决方案2】:

可能在您的应用程序中,主线程中的长任务会阻塞 UI,并且在 UI 解锁后发生单击事件。

点击按钮后你应该:

  1. 设置按钮禁用
  2. 在其他线程中运行操作 - 使用 Thread 类或 AsyncTask
  3. 操作完成后将按钮设置为启用

【讨论】:

    【解决方案3】:

    在类的某处定义一个 AtomicBoolean 变量。

    private AtomicBoolean tokenTaken = new AtomicBoolean();
    

    在您的按钮单击侦听器中,将原子变量设置为 true。

    public void refresh(View view){
        if(!tokenTaken.compareAndSet(false,true))
            return;
        ...//Rest of your code.
        //set the token false when you want to enable the button.
        tokenTaken.set(false);
    }
    

    参考: https://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2016-09-03
      • 2020-09-09
      • 1970-01-01
      相关资源
      最近更新 更多