2011-01-09 13 views
27

アンドロイドのViewからリスナーを削除する方法はありますか?私はを持っています。それにはCheckChangedListenerが添付されています。問題は、setChecked()を呼び出すとリスナーが起動するということです。アンドロイドのビューからリスナーを削除する

リスナーを削除できない場合は、setChecked()を手動で呼び出すときとリスナーからタッチイベントをチェックするときに、リスナーが発砲しないようにする方法がありますか?

答えて

59

まあ、私は答えを見つけました。これはどこにでも書かれているようですが、Viewクラスのコードを調べて、nullをsetClickListenerメソッドに渡すとリスナーが削除されます。

checkbox.setOnCheckChangedListener(null); 

これは任意のイベントリスナーで有効です。

+1

IDは、文書化されていない機能を使用することに慎重であり、いつでも変更することができます。 –

+4

私はこれを「文書化されていない機能」とは厳密には呼んでいません。ビューが特定の型の単一のリスナーをサポートしていて、その1つのリスナーをnullに設定した場合は、ほかに何が起こると思いますか? :) – adamp

+3

これは文書化されていない機能ではありません。ヌルを渡すのが安全だと書かれています。ビューが使用する内部リスナーは、構築時にnullとして開始され、イベントをディスパッチするかどうかを決定するときにnullと照合されます。 nullを設定すると、リスナーを設定する前の値にリセットされます。 – Falmarri

2

setChecked()を呼び出す前にリスナーを設定してから、有効なものを後で戻すことができます。

5

なぜcheckChangeListenerを手に入れましたか? onClicklListenerを使用する場合は、あなたのために機能するかもしれませんか?

-4

あなたはちょうどremoveListener(this)を使用します。私はここに何かを逃していますか

+6

Viewクラスには "removeListener"メソッドがありません... – Falmarri

0

Spinnerビューでも同様の問題がありました。私の解決策は、OnItemSelectedメソッドでチェックするクラスメンバー変数を作成することでした。 Spinnerの内容/選択をプログラムで変更する前に、この変数をtrueに設定しました。 OnItemSelectedが起動すると、変数がtrueの場合、私はfalseに変更し、何もせずにただreturnに変更します。欠点は、この変数がコード全体に渡って設定されるため、トラブルシューティングが難しいことです。

関連する問題