Android - 禁用按钮仍然有效

时间:2014-07-17 12:47:43

标签: android button

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

... android:onClick="refresh"

在方法的开头我设置了这些:

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

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

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

<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();           
    }
}

3 个答案:

答案 0 :(得分:0)

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

     android:onClick="refresh"

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

答案 1 :(得分:0)

可能在您的应用程序中,主线程中的长任务阻止UI和点击事件在UI解锁后出现。

单击按钮后,您应该:

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

答案 2 :(得分:0)

在类中的某个地方定义一个AtomicBoolean变量。

private AtomicBoolean tokenTaken = new AtomicBoolean();

在按钮中单击侦听器,将atomic变量设置为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