1

設定フラグメントの設定で長いタップとクリックをキャプチャする方法を知っている人はいますか?

具体的には、DialogPreference を拡張するクラスがあり、それがクリックされたかロングタップされたかに基づいて別のダイアログを開きたいと考えています。

私はしばらくの間これを実装しようとしてきましたが、設定フラグメントで機能させることができないようです。 「ロングクリックリスナー」をプリファレンスに追加するには?

ありがとう!

4

2 に答える 2

2

ネストされた設定画面の場合、これを機能させるのに苦労しました。フラグメント自体によって表示される ListView は、最上位のリストにすぎません。サブスクリーンを開くと、内部で実際にダイアログがポップアップします。(1) PreferenceScreen は最終的なものであり、(2) アイテムがクリックされるまでダイアログは存在せず、(1) のためにフラグメントからダイアログを取得することは困難または不可能であるため、これは問題があります。

解決方法は少しハックですが、「階層の上からlistViewを取得できない場合は、下から取得できる」と考えました。私の PreferenceScreen はたまたまカスタム設定のインスタンスでいっぱいでした。Preference は明らかに最終的なものではないため、Preference のビューが作成されたときに PreferenceScreen がオンになっていることが確実に存在するという事実を利用できます。非常に簡単にアクセスして、Kostya の方法を適用できます。

public class MyEditTextPreference extends EditTextPreference {

    @Override
    protected View onCreateView(ViewGroup parent) {
        ListView listView = (ListView)parent;
        listView.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                ListView listView = (ListView) parent;
                ListAdapter listAdapter = listView.getAdapter();
                Object obj = listAdapter.getItem(position);
                if (obj != null && obj instanceof View.OnLongClickListener) {
                    View.OnLongClickListener longListener = (View.OnLongClickListener) obj;
                    return longListener.onLongClick(view);
                }
                return false;
            }
        });
        return super.onCreateView(parent);
    }
}

もちろん、これを行う設定が複数ある場合は、リスナーを何度も設定し続けることになります。必要に応じて、これを防ぐためにいくつかのチェックを追加できます。

于 2015-12-08T22:37:21.953 に答える