2013-10-05 66 views
1

有沒有人知道一種方式,我可以捕獲一個長期點擊以及在偏好片段中的偏好點擊?長按偏好片段?

具體來說,我有一個擴展DialogPreference類,我希望它打開一個不同的對話框,基於它是單擊還是長按。

我一直在試圖實施這個一段時間了,似乎無法使它與偏好片段一起工作。 How to add a "long click listener" to a Preference?

謝謝!

回答

0

添加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> 
2

我有困難使得在嵌套優先選擇屏幕的情況下,這項工作。由片段本身看到的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); 
    } 
} 

當然,如果你有多個喜好這樣做,你會不斷設置監聽器一遍又一遍。如果需要,您可以添加一些檢查來防止這種情況發生。