web-dev-qa-db-ja.com

Android:非表示のオブジェクトはまだクリック可能

ユーザーの操作に応じて表示または非表示になるボタンや画像があるアクティビティがあります。

私が見つけているのは、背後にあるオブジェクトが非表示に設定されているにもかかわらず、クリックがトリガーされているということです。クリックされることに関連するコードを処理していませんが、一時的に再表示され、クリックされるとすぐに再び消えます。

それらはまた、それらの上に置かれたボタンを幾分妨げているように見えます。これらのボタンは、背後に目に見えないオブジェクトがある場合、非常に手間がかかり、クリックするのが困難になることがあります。

私は単純に使用しています:

object.setVisibility(View.VISIBLE);

そして:

object.setVisibility(View.INVISIBLE);

アイテムを表示または非表示にするため。これは私がやるべきことではありませんか?

編集:

人々は、彼らが私に与えているのと全く同じコードを私に尋ね続けます。これは私が与えられたコードであり、現在使用しています。

        btnLifePlus5.setVisibility(View.GONE);
        btnLifePlus5.setFocusableInTouchMode(false);
        txtLifePlus5.setVisibility(View.GONE);
        txtLifePlus5.setFocusableInTouchMode(false);
        btnLifePlus1.setVisibility(View.GONE);
        btnLifePlus1.setFocusableInTouchMode(false);
        txtLifePlus1.setVisibility(View.GONE);
        txtLifePlus1.setFocusableInTouchMode(false);
        btnLifeMinus5.setVisibility(View.GONE);
        btnLifeMinus5.setFocusableInTouchMode(false);
        txtLifeMinus5.setVisibility(View.GONE);
        txtLifeMinus5.setFocusableInTouchMode(false);
        btnLifeMinus1.setVisibility(View.GONE);
        btnLifeMinus1.setFocusableInTouchMode(false);
        txtLifeMinus1.setVisibility(View.GONE);
        txtLifeMinus1.setFocusableInTouchMode(false);

これは、単にそれらを非表示として設定することに違いはありません。

15
Bisclavret

このばかげた問題を解決するために私が管理した唯一の方法は、私の活動のオブジェクトの間に位置する一種のビューパネルを作成することでした。このビューパネルは画面のサイズであり、同じ色の背景を使用し、非表示から始まります。

通常は、オブジェクトAを非表示にし、オブジェクトBを表示します。以前にオブジェクトAが占めていたスペースをクリックすると、一時的に画面にフラッシュして戻って消えます。ひどいですね。その後のクリックでは、次にオブジェクトAが消えるまでこのバグは再現されません。

修正は、オブジェクトAを非表示にし、新しいビューパネルをその上に表示して、オブジェクトBをビューパネルの上に表示することです。したがって、パネルは、非表示オブジェクトとユーザー操作の間の一種のバリアとして機能します。ユーザーは、このビューパネルが標準の背景に溶け込んでいるため、このビューパネルが存在していることに気づいていませんが、オブジェクトAがあるスペースをクリックすると、画面に一瞬表示されなくなりました。これは使用する必要がある貧弱な解決策ですが、このOSにはバグがあり、私には選択肢がありません。

私の活動は、完全に安定していて、完全に機能しているように見えます。嫌いですが、うまくいきます。

どうもありがとう、グーグル。

0
Bisclavret

Viewを非表示にしても、リスナーをトリガーすることはできます。それはあなたがそれを見ることができないだけであり、それが他のすべてのものはそれが見えるかのように同じになるでしょう。

まったく使用したくない場合は、View.GONEに変更します。

View.INVISIBLEView.GONEの違い:非表示のオブジェクトは割り当てられたスペースを利用し続けますが、View.GONEとして設定されたオブジェクトはスペースのスペースをオンにしないかのように残します画面。

使用する

object.setVisibility(View.GONE);

のではなく

object.setVisibility(View.INVISIBLE);
19
Rohit5k2

代わりにobject.setVisibility(View.GONE);を使用してくださいobject.setVisibility(View.INVISIBLE);

View.GONE意味このビューは非表示であり、レイアウトのためにスペースをとりません。

View.GONEこのビューは非表示で、レイアウトのためにスペースを取りません。

View.INVISIBLEこのビューは非表示ですが、レイアウトのためにスペースを占有します。

お役に立てれば幸いです。

7
IntelliJ Amiya

試してみてください:object.setClickable(false);別の方法として、次のことができます:object.setEnabled(false);

3
Fustigador

object.setVisibility(View.GONE)をお試しください

View.GONEは、ビューがレイアウトの境界(幅と高さ)を描画しないようにしますが、View.INVISIBLE描画します。

1
Malwinder Singh

あなたは使うべきです:

object.setVisibility(View.GONE);

View.GONEはビューをレイアウトから完全に削除しますが、View.INVISIBLEは、ビューを非表示にするだけですが、それでもレイアウト内にあるため、クリック可能です。

0
Hussein El Feky