我已经创建了一个包含“下一页”和“上一页”两个按钮的布局。在这些按钮之间,我正在生成一些动态视图。因此,当我首次启动应用程序时,由于没有任何先前的视图,我想禁用“上一页”按钮。当没有更多视图可显示时,我还想禁用“下一页”按钮。有没有办法禁用这些按钮?
我已经创建了一个包含“下一页”和“上一页”两个按钮的布局。在这些按钮之间,我正在生成一些动态视图。因此,当我首次启动应用程序时,由于没有任何先前的视图,我想禁用“上一页”按钮。当没有更多视图可显示时,我还想禁用“下一页”按钮。有没有办法禁用这些按钮?
你试过这个了吗?
myButton.setEnabled(false);
更新:感谢Gwen。几乎忘了可以在你的XML布局中设置android:clickable
来确定按钮是否可点击。
是的,可以在XML中禁用它,只需使用:
<Button
android:enabled="false"
/>
android:enabled
。(即使到现在也是如此。) - Kevin KrumwiedesetEnabled
起作用。 - FindOutIslamNow你无法在XML中启用或禁用它(因为布局是在运行时设置的),但是你可以在活动启动时设置是否可点击,使用android:clickable
。
您只需在活动中编写一行代码
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
当您想要启用相同的按钮时,只需编写
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
((Button)findViewById(R.id.mybutton)).setEnabled(false);
它的作用是禁用一个名为"mybutton"的按钮。 - Matt Clark在Java中,一旦您获得了按钮的引用:
Button button = (Button) findviewById(R.id.button);
要启用/禁用按钮,您可以使用以下任一方法:
button.setEnabled(false);
button.setEnabled(true);
或者:
button.setClickable(false);
button.setClickable(true);
如果您想从一开始就禁用按钮,则可以在onCreate方法中使用 button.setEnabled(false);。 否则,您可以直接从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" />
在 Kotlin 中,如果您使用 id 引用 Button View,则可以像这样启用/禁用按钮
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
就我的情况而言,
myButton.setEnabled(false);
myButton.setEnabled(true);
目前情况是功能正常,它能够按照预期启用和禁用按钮。但是一旦按钮状态变为禁用状态,即使它可点击,也不会再回到启用状态。我尝试了使绘图状态失效并刷新,但没有成功。
myButton.invalidate();
myButton.refreshDrawableState();
如果你或其他人遇到类似的问题,我使用的解决方法是重新设置背景drawable。在任何API级别上都有效。
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
Kotlin让你可以做到以下事情:
// to disable clicks
myButton.isClickable = false
// to disable button
myButton.isEnabled = false
// to enable clicks
myButton.isClickable = true
// to enable button
myButton.isEnabled = true
错误的方法:在监听器中使用变量而不是参数!!!
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类对象会回调方法onClick()并将自身作为参数发送,因此如果发生null视图参数,则是一个断言错误。例如当View对象类在此期间被销毁(例如被GC收集)或由于黑客攻击而篡改方法时,可能会发生这种情况。View.OnClickListener
is Interface definition for a callback to be invoked when a view is clicked.
with method definition
void onClick(View v);
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)
你可以在xml中禁用按钮,但那不会是动态的。最好的方式是动态地禁用按钮。
myButton.setEnabled(false);