web-dev-qa-db-ja.com

android View.GONEでの表示は、onTouchとonClickを引き続き受け取ります

これは私を混乱させています:

私が読んだ限りでは、setVisibility(View.GONE)を持つビューです。タッチまたはクリックイベントをこれ以上受信しないでください。レイアウトには2つの部分があり、それらは一度に表示または使用できるように表示または削除されますが、View.GONEはそのトリックを行いません。予想どおり、GONEビューは表示されませんが、onClickに反応します(他のビューが取得するイベントを消費します)。

手伝って頂けますか?

興味深いかもしれません:プロジェクトを開始すると、一方のビューはGONE、もう一方は表示されます。今回は期待どおりに動作します(GONEビューは基本的に無視されます)が、コードでView.GONEを設定すると、動作を停止します。

73
ShadowMare

アニメーションを使用してビューを表示/非表示にしますか? Android:fillEnabled = "true" Android:fillAfter = "true"のアニメーションを使用すると、この動作が発生します。理解できないため、バグのようです。fillEnabled/ fillAfterなしでアニメーションを使用すると、すべて正常に動作します。 ..

108
edovino

アニメーションの後にsetVisibility(View.GONE)を設定した場合(フェードアウトなど)、clearAnimation()を使用してアニメーションをクリアしてみてください。これは私を助けたものです。

98
Pavel Alexeev

SetVisibility(View.GONE)の後にsetClickable(false)を使用してclickableプロパティをfalseに設定してみてください

8
Anil

はい、mview.clearAnimation()にはいくつかの問題がありますが、amination.setFillAfter(false);mview.setClickable(false);は完璧です。

5
Hemant Shori

私が期待しているのは、ビューを非表示にしますが、ビューの子はまだクリックに応答するということです(つまり、ビューはViewGroupです)。次の行に沿って何かを行うことができます。

private void hideTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            hideTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.GONE);
    }
    else {
        v.setClickable(false);
        v.setVisibility(View.GONE);
    }
}

もちろん、反対もする必要があります

private void showTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            showTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.VISIBLE);
    }
    else {
        v.setClickable(true);
        v.setVisibility(View.VISIBLE);
    }
}

これは過去に私のために働いた。私は現在、これを行うためのより良い方法を知りません。

2
Siebe

上記の回答を行っても問題が解決しない場合は、親ビューからビューを削除することをお勧めします。ビューを再度表示する必要がある場合は、コピーを作成して親ビューに追加するだけです。

これはやり過ぎに見えるかもしれませんが、ボタン、テキストビュー、または画像の場合、ビューグループ全体を非表示/表示していましたが、このソリューションは引き続き機能します。

1
Kim Montano

これをコメントとして投稿することもありましたが、残念ながらコメントを投稿できませんでした。それはあなたのための可能な解決策になる可能性があるので、私はそれをそのように投稿します:

「onClick」を書くとき、XMLレイアウトでonClick属性を使用していると思います。 OnClickListener属性の代わりにsetOnClickListeneronClickを設定してください。たぶんこれが役立ちます...

1
M.E.

ビューにアニメーションがある場合は、view.clearAnimationを呼び出す必要があります。

0
lingyfh

onAnimationEndオーバーライドに.clearAnimation()を追加してみてください。

0
doodlleus