如何禁用Androidbutton?
我创build了一个包含两个buttonNext和Previous的布局。 在button之间,我正在生成一些dynamic视图。 所以当我第一次启动应用程序时,我想禁用“Previous”button,因为不会有任何以前的视图。 我也想禁用“下一步”button,当没有更多的意见来显示。 反正有禁用button?
你试过这个吗?
myButton.setEnabled(false);
更新:感谢Gwen。 几乎忘了android:clickable
可以在你的XML布局中设置,以确定一个button是否可以点击或不可以。
您不能在XML中启用它或禁用它(因为您的布局是在运行时设置的),但是您可以设置在android:clickable
的启动时是否android:clickable
。
你只要在你的活动中写一行代码
Button btn = (Button) findViewById(R.id.button1); btn.setEnabled(false);
当你想启用相同的button只需写入
Button btn = (Button) findViewById(R.id.button1); btn.setEnabled(true);
在Java中,一旦你有了button的引用:
Button button = (Button) findviewById(R.id.button);
要启用/禁用该button,您可以使用以下任一项:
button.setEnabled(false); button.setEnabled(true);
要么:
button.setClickable(false); button.setClickable(true);
既然你想从头开始禁用button,你可以使用button.setEnabled(false); 在onCreate方法中。 否则,从XML,你可以直接使用:
android:clickable = "false"
所以:
<Button android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/button_text" android:clickable = "false" />
就我而言,
myButton.setEnabled(false); myButton.setEnabled(true);
工作正常,它是启用和禁用button,因为它应该。 但是,一旦button状态变为禁用状态,它将不会再次回到启用状态,尽pipe它是可点击的。 我试图无效和刷新绘图状态,但没有运气。
myButton.invalidate(); myButton.refreshDrawableState();
如果您或任何人有类似的问题,什么对我来说是设置可再次绘制的背景。 适用于任何API级别。
myButton.setEnabled(true); myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
是的,它可以在XML中被禁用,只需使用<Button android:enabled="false"/>
首先在xml中使button为android:clickable="false"
<Button android:id="@+id/btn_send" android:clickable="false"/>
然后在你的代码中,在oncreate()
方法里面设置button属性为
btn.setClickable(true);
然后在button里面点击更改代码
btn.setClickable(false); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); btnSend = (Button) findViewById(R.id.btn_send); btnSend.setClickable(true); btnSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { btnSend.setClickable(false); } }); }
错误的方式在听者使用variables的参数!
btnSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { btnSend.setClickable(false); } });
正确的方法:
btnSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /** check given view by assertion or cast as u wish */ if(v instance of Button) { /** cast */ Button button = (Button) v; /** we can perform some check up */ if(button.getId() == EXPECTED_ID) { /** disable view */ button.setEnabled(false) button.setClickable(false); } } else { /** you can for example find desired view by root view */ Button bt = (Button) v.getRootView().findViewById(R.id.btId); /*check for button */ if(bt!=null) { /** disable button view */ ... } else { /** according to @jeroen-bollen remark * we made assumption that we expected a view * of type button here in other any case */ throw new IllegalArgumentException("Wrong argument: " + "View passed to method is not a Button type!"); } } } });
编辑:回复@ jeroen-bollen
View.OnClickListener
是单击视图时要调用的callback的接口定义 。
用方法定义
void onClick(View v);
当视图被点击时,View类对象将callback方法onClick()作为参数本身发送,所以不应该发生null视图参数,如果它是一个断言错误它可能发生,例如当视图对象类被破坏的同时由GC收集的例子)或方法被黑客篡改
一点关于instanceof&null
JLS / 15.20.2。 types比较运算符instanceof
在运行时,如果RelationalExpression的值不为null,并且可以将引用强制转换为ReferenceType而不引发ClassCastException,则instanceof运算符的结果为true。
否则结果是错误的 。
作者三个字
如果你问为什么?
主要是为了避免NullPointerException
更多的代码将节省您的时间在以后的代码错误跟踪和减lessexception的发生。
考虑下面的例子:
View.OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { btnSend.setClickable(false); } }); btnSend.setOnClickListener(listener) btnCancel.setOnClickListener(listener)
在Kotlin中,如果您将Button View与id关联,那么启用/禁用button就像
layout.xml
<Button android:id="@+id/btn_start" android:layout_width="100dp" android:layout_height="50dp" android:text="@string/start" android:layout_alignParentBottom="true"/>
activity.kt
btn_start.isEnabled = true //to enable button btn_start.isEnabled = false //to disable button