有沒有人知道一種方式,我可以捕獲一個長期點擊以及在偏好片段中的偏好點擊?長按偏好片段?
具體來說,我有一個擴展DialogPreference類,我希望它打開一個不同的對話框,基於它是單擊還是長按。
我一直在試圖實施這個一段時間了,似乎無法使它與偏好片段一起工作。 How to add a "long click listener" to a Preference?
謝謝!
有沒有人知道一種方式,我可以捕獲一個長期點擊以及在偏好片段中的偏好點擊?長按偏好片段?
具體來說,我有一個擴展DialogPreference類,我希望它打開一個不同的對話框,基於它是單擊還是長按。
我一直在試圖實施這個一段時間了,似乎無法使它與偏好片段一起工作。 How to add a "long click listener" to a Preference?
謝謝!
添加onCreateView()到您的PreferenceFragment類:
public class MyPreferenceFragment extends PreferenceFragment implements OnItemLongClickListener {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("TAG", "onCreateView");
View view = inflater.inflate(R.layout.settings, container, false);
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setOnItemLongClickListener(this);
return view;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("TAG", "onItemLongClick");
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);
} else {
Preference pref = (Preference) obj;
...
}
return true;
}
...
}
的settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
我有困難使得在嵌套優先選擇屏幕的情況下,這項工作。由片段本身看到的ListView只是頂級列表。當你打開一個子屏幕時,你會彈出一個對話框。這是有問題的,因爲(1)PreferenceScreen是最終的,並且(2)直到單擊該項目時該對話框才存在,並且由於(1),從片段獲得對話是困難的或不可能的。
我解決這個問題的方式有點破解,但我想,「如果我無法從層次結構中獲取listView,我可以從下面獲取它。」我的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);
}
}
當然,如果你有多個喜好這樣做,你會不斷設置監聽器一遍又一遍。如果需要,您可以添加一些檢查來防止這種情況發生。