FAQ_07_android:clickable 问题

在android Button的xml文件属性中有这麽一个属性标签:

android:clickable
该标签(继承自View的xml属性)的值必须是boolean值,即true、false。该标签目的是设置button是否可以被点击。

于是,我Demo一把,xml文件如下:

<Button
    android:id="@+id/btn_to"
    android:clickable="false"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="to"
    />  
不好意思,运行之后,该Button一如既往的好使,并没有“不可点击”。搞不明白、、、、

在 android 中几乎每一个xml属性,对应的都有一个方法,于是我改用下面的方法:

setClickable();
心里想,这次应该可以了,示意代码:

btn_to.setClickable(false);
btn_to.setOnClickListener(new Button.OnClickListener() {

	@Override
	public void onClick(View v) {
	  // to do	
	}
});
再次运行,还是不行!没办法,看源码吧!

我们知道,点击 button 会触发下面的源码(View.java):

public void setOnClickListener(OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        mOnClickListener = l;
    }
呵呵,你会明白,只要点击button都会将setClickable设置为true,所以在setOnClickListener之前setClickable设置为false只不过是多此一举!

那么,解决办法就出来了,调换一下代码的位置即可:

btn_to.setOnClickListener(new Button.OnClickListener() {

	@Override
	public void onClick(View v) {
	    // to do
	}
});
		
btn_to.setClickable(false);

这样,你再次点击button试一试,呵呵,它无动于衷了吧!

yes,搞定!


``` package com.example.progressdemo; import java.util.Iterator; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends Activity { private Button btn_start; private ProgressBar mBar; private TextView tv_show_progress; //声明一个handler,用于在线程中发送消息修改界面的textView中的值 private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { //根据progressBar的进度来设置textView中的值 //设置progressBar的进度 mBar.setProgress(msg.what); tv_show_progress.setText(msg.what+""); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_start = (Button) findViewById(R.id.btn_start); mBar = (ProgressBar) findViewById(R.id.progressBar1); tv_show_progress = (TextView) findViewById(R.id.textView_show_progress); btn_start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //在单击事件中开一个线程来模拟后台扫描文件 new Thread() { public void run() { //扫描过程中不能再次启动扫描,所以将BUTTON设置为不可点击 btn_start.setClickable(false);/////这句为什么不能用setenable for (int i = 0; i < 101; i++) { //在子线程中不能修改UI线程中数据,所以需要一个handler来发送消息修改 mHandler.sendEmptyMessage(i); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //扫描完成后将BUTTON还原成可点击的状态 btn_start.setClickable(true); }; }.start(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } ```
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页