4

コンテキスト メニューを起動する TextView があります。

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu contextMenu, 
                                            View view,
                                            ContextMenu.ContextMenuInfo contextMenuInfo) {
                // Do stuff... 
            }
        });

この textview のandroid:autoLink="all"XML にも属性が設定されています。

ここで、TextView のコンテンツを URL に設定し、その URL を長押しすると、最初にコンテキスト メニューが表示されますが、指を離すとリンクが押されてブラウザーが開きます。

リンクがクリックされないように、コンテキストメニューまたは長押しでタッチイベントを消費する方法はありますか? TextView が ACTION_UP イベントを処理するようにオーバーライドすることを検討onTouch()しましたが、タッチ イベントをブロックするためにコンテキスト メニューがいつ表示されるかを確実に追跡することはできません。

4

3 に答える 3

2

これは私にはややハックに思えますが、ビューのタッチイベントを直接処理せずにこれを機能させることができた唯一の方法です (これが適切な方法である可能性が非常に高いです)。

LinkMovementMethodコンテキスト メニューが開いた場合は基本的に TextView を変更しているため、 upアクションはリンクを起動しません。LinkMovementMethodコンテキスト メニューを閉じると、リンクの通常のクリックが期待どおりに機能するように復元されます。

onCreateContextMenu()次のようにメソッドを調整します。

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu,
                                        View view,
                                        ContextMenu.ContextMenuInfo info) {
            textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            // Do stuff
        }
    });

次に、Activity を次のonContextMenuClosed()ようにオーバーライドします。

@Override
public void onContextMenuClosed(Menu menu)
{
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}

もちろん、これはそれtextViewが Activity のクラス メンバーであることを前提としています。

于 2014-12-10T04:19:48.550 に答える