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()しかし、これは非常に奇妙に機能します。どういうわけか、この場合の両方のレイアウトが1秒ごとに表示されたり消えたりするか、まったく表示されません-コードでメソッドが使用されていないため、まったく理解できません!
残っている唯一の方法は、すべてのビュー (ボタン) を繰り返して無効にし、元に戻すことです。
他に方法はありますか?
UPDATE
最後に、「壁」レイアウトをxmlに追加する必要がありました。クリック可能でフォーカス可能にすることで、ソリューションになります。

4

9 に答える 9

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

ネストされたレイアウトのすべてのボタンを無効にします。

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 に答える
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 に答える
-2

XML でボタン宣言に次の 2 行を記述します。

Android:setEnabled="false" Android:clickable="false"

于 2013-06-06T11:41:56.620 に答える