3

应用程序的工作方式如下:应用程序向用户提示 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 中添加一个“墙”布局。现在通过使其可点击和可聚焦,它成为一个解决方案。

4

9 回答 9

3

尝试设置每个 Button 的 xml 定义

android:duplicateParentState="true"

我不确定,但我认为这不仅应该让他们看起来很残疾,而且应该采取相应的行动。

于 2013-06-06T11:20:22.027 回答
1

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

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

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

  for(int i=0;i<relativeLayout.getChildCount();i++){
       View child=relativeLayout.getChildAt(i);
       //your processing....
       child.setEnabled(false);
  } 
于 2013-06-06T11:14:37.530 回答
0

首先定义你的按钮

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

并将启用设置为 false;

于 2013-06-06T11:32:06.267 回答
0

爪哇:-

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 的实例,或者您想要的任何一个实例,然后禁用它!

于 2020-12-06T07:00:37.270 回答
0

Might work in constraint layout . Use group widget and add all the button ids. In the java code set enabled false for the group.

于 2021-03-03T16:14:01.283 回答
0

我使用扩展来锁定和解锁视图

//lock
fun View.lock() {
isEnabled = false
isClickable = false}
//unlock
fun View.unlock() {
isEnabled = true
isClickable = true}

如果要锁定视图组的所有子项

//lock children of the view group
fun ViewGroup.lockAllChildren() {
views().forEach { it.lock() }}

//unlock children of the view group
fun ViewGroup.unlockAllChildren() {
views().forEach { it.unlock() }}
于 2021-11-11T10:26:21.157 回答
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>
于 2020-12-08T15:03:57.540 回答
0

用于禁用任何嵌套布局中的所有按钮。

void DisableAllButtons( ViewGroup viewGroup ){
    for( int i = 0; i < viewGroup.getChildCount(); i++ ){
        if( viewGroup.getChildAt(i) instanceof ViewGroup ){
            DisableAllButtons( (ViewGroup) viewGroup.getChildAt(i) );
        }else if( viewGroup.getChildAt(i) instanceof Button ){
            viewGroup.getChildAt(i).setEnabled( false );
        }
    }
}
于 2022-01-26T10:57:04.880 回答
-2

在 XML 中的按钮声明上写下这两行

android:setEnabled="false" android:clickable="false"

于 2013-06-06T11:41:56.620 回答