2

現在、Android Api Lvl 8 で OnLongClickListener と戦っています。

次のコードを使用します。

this.webView.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        System.out.println("long click");
        return true;
    }
});

それは完全に機能します。WebView の任意の場所を押すと、毎回イベントがトリガーされます。

これを見てみましょう:

this.webView.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        final EditText editText = getUrlTextField();

        switch (editText.getVisibility()) {
        case View.VISIBLE:
            editText.setVisibility(View.GONE);
            return true;
        case View.GONE:
            editText.setVisibility(View.VISIBLE);
            return true;
        default:
            return false;
        }
    }
});

URL EditText コンポーネントが現在表示されていると仮定すると、表示から消え、別の長いクリック イベントがトリガーされたときに再び表示されるはずです。しかし、これを実行すると、WebView の任意の位置で長いクリックを実行したときに、イベントは 1 回 (!) だけ機能します。複雑なことに、ウェブサイト上のリンクで長いクリックを実行すると、長いクリックが再び機能します...

それが SDK のバグであるかどうか、および/または OnLongClickListener がどのように機能しているかの私の考えに間違いがあるかどうか、誰かが説明できますか?!? :/

編集:

Nexus One でいくつかの異なるシナリオを実行して、次の結論に達しました。

誰かが私にヒントを与えることができれば本当に感謝しています...私は知恵の終わりです:(

4

2 に答える 2

1

個人的には、再レイアウトのたびにリスナーを再設定することになりました。

于 2012-03-19T13:37:21.710 に答える
0

私もこの問題に遭遇しました。子ビューの境界を変更する必要がある方法でビューのレイアウトが変更された場合 (つまり、TextView が wrap_content の幅で、そのテキストを以前よりも長い/短いものに設定した場合)、階層内のビューでonStartTemporaryDetachメソッドが呼び出されるようです。 (おそらくレイアウトパスが原因ですが、確実に見つけるのに十分なほど深く掘り下げていません)。そのソースを見ると、View最終onStartTemporaryDetach的にビューの押された状態が解除されます。

定期的に更新されるレイアウトのビューを、設定した値に関係なく変更されない境界を持つように変更すると、問題が修正されます。とはいえ、それはまだ素晴らしいことではありません。

于 2013-06-25T23:35:59.060 に答える