如何禁用布局中的所有按钮?

时间:2013-06-06 11:08:08

标签: android android-layout

应用程序的工作方式如下:应用程序向用户提示30个按钮,用户可以通过点击猜出正确的按钮。当用户点击某个按钮时,所有按钮(例如包含这些按钮的视图)应该被锁定,同时播放相应的(正确或错误的猜测)动画。点击按钮本身应该被禁用,直到下一轮。动画结束后,所有未点击的按钮(例如包含这些按钮的视图)应该再次可用 所以我有一个布局,其中包含这30个按钮的另一个布局:

...
    <RelativeLayout
        android:id="@+id/alphabetContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <include layout="@layout/alphabet" />
    </RelativeLayout>
...

现在我需要锁定单击按钮然后解锁。所以我试过了:

...
private RelativeLayout alphabetPanel;
...
public void onCreate(){
...
alphabetPanel = (RelativeLayout) findViewById(R.id.alphabetContainer);
...
}
...
private void lockButtons(){
alphabetPanel.setEnabled(false);
}

但这不会锁定按钮。我也尝试过:

alphabetPanel.setFocusable(false);
alphabetPanel.setClickable(false);

也没有帮助。似乎它只依赖于布局本身而不是它包含的视图。
此外,我尝试添加一个假布局,通过将它放在前面,将它放在布局上。这是一种解决方法,它的两个布局都必须只放在RelativeLayout内:

...
        blockingLayout = new RelativeLayout(this);
        blockingLayout.setLayoutParams(alphabetPanel.getLayoutParams());
...

但是这很奇怪:在这种情况下,两种情况下的两种布局都会出现并且每隔一秒左右就会消失或者根本不会出现 - 我无法理解,根本没有在代码中使用setVisibility()方法!
剩下的唯一方法是迭代每个视图(按钮)以使其禁用而不是返回 还有其他方法吗?
更新
最后我不得不在xml中添加一个“wall”-layout。现在,通过使其可点击和可聚焦,它成为一种解决方案。

7 个答案:

答案 0 :(得分:3)

尝试设置每个Button的xml定义

android:duplicateParentState="true"

我不确定,但我认为它不仅应该使他们看起来像残疾人,而且还应该采取相应行动。

答案 1 :(得分:0)

嗯,令我惊讶的是,禁用父布局不起作用..据我所知应该这样做。

尝试获取包含的布局,然后禁用它。

无论如何,如果所有其他方法都失败了,你可以随时循环浏览按钮。

  for(int i=0;i<relativeLayout.getChildCount();i++){
       View child=relativeLayout.getChildAt(i);
       //your processing....
       child.setEnabled(false);
  } 

答案 2 :(得分:0)

首先定义你的按钮

Button bit = (Button)findViewById(R.id.but);
bit.setEnabled(false);

并设置启用false;

答案 3 :(得分:0)

Java:-

public void disableButtons(Layout layout) {

    // Get all touchable views
    ArrayList<View> layoutButtons = layout.getTouchables();

    // loop through them, if they are instances of Button, disable them.
    for(View v : layoutButtons){
        if( v instanceof Button ) {
            ((Button)v).setEnabled(false);
        }
    }
}

科特琳:-

fun disableButtons(layout: Layout) {

    // Get all touchable views
    val layoutButtons: ArrayList<View> = layout.getTouchables()

    // loop through them, if they are instances of Button, disable them.
    for (v in layoutButtons) {
        if (v is Button) {
            (v as Button).setEnabled(false)
        }
    }
}

将所有可触摸的视图检索到ArrayList中,然后遍历它们,并检查它是否是Button或TextView的实例,或者是您想要的哪个实例,然后将其禁用!

答案 4 :(得分:0)

如果需要数据绑定

import android.view.ViewGroup
import android.widget.Button
import androidx.core.view.children
import androidx.databinding.BindingAdapter

@BindingAdapter("disableButtons")
fun ViewGroup.setDisableButtons(disableButtons: Boolean) {
    children.forEach {
        (it as? Button)?.isEnabled = !disableButtons
    }
}

用法:

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="@dimen/guideline"
        app:disableButtons="@{vm.busy}">
....
</androidx.constraintlayout.widget.ConstraintLayout>

答案 5 :(得分:0)

可能适用于约束布局。使用组小部件并添加所有按钮 ID。 在java代码集中为组启用false。

答案 6 :(得分:-2)

在XML

的按钮声明中写下这两行

机器人:的setEnabled = “假” 机器人:可点击= “假”