2012-01-18 55 views
3

我有一個PreferenceActivity我想在其中動態添加首選項。如何添加一個「長按聽衆」的偏好?

在很長的點擊,這些人要做些什麼,但OnPreferenceClickListener只支持普通點擊,沒有長期的點擊。

是否有實現此功能的方式,我錯過了什麼?

感謝

回答

11

看看this幫助。


在該鏈接死亡事件,這裏是後該鏈接的主體。注意:我沒有在下面寫任何東西。

內置的優先級有一個方法來獲得點擊,的onClick,但沒有方法來接收長點擊。在我目前的項目中,我確實需要這個,並找到了實現它的方法。

PreferenceActivity實際上是一個ListActivity,與幕後一個特殊的適配器。通常的(不長)點擊通過使用通常的ListView機制setOnItemClickListener進行處理。設置此代碼是在PreferenceScreen:

public final class PreferenceScreen extends PreferenceGroup implements AdapterView.OnItemClickListener.... { 
    public void bind(ListView listView) { 
     listView.setOnItemClickListener(this); 
     listView.setAdapter(getRootAdapter()); 

     onAttachedToActivity(); 
    } 

    public void onItemClick(AdapterView parent, View view, int position, long id) { 
     Object item = getRootAdapter().getItem(position); 
     if (!(item instanceof Preference)) return; 

     final Preference preference = (Preference) item; 
     preference.performClick(this); 
    } 
} 

這將是非常容易的子類PreferenceScreen並覆蓋綁定到長項單擊監聽器添加到列表視圖,只是這個類是final。正因爲如此,我最終加入以下代碼到我的PreferenceActivity子類:

public class BlahBlahActivity extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.account_options_prefs); 

     ListView listView = getListView(); 
     listView.setOnItemLongClickListener(new 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; 
      } 
     }); 
    } 
} 

現在我可以有一個偏好的子類實現View.OnLongClickListener,這是自動長期點擊調用:

public class BlahBlahPreference extends CheckBoxPreference implements View.OnLongClickListener { 
    @Override 
    public boolean onLongClick(View v) { 
     // Do something for long click 
     return true; 
    } 
} 
+0

是的,這工作完美!謝謝=) – Force 2012-01-18 16:53:43

+0

我怎麼知道哪些偏好確實是長時間點擊?你從名單適配器(看onItemLongClick法)獲得 – 2013-04-06 12:55:53

+0

@androiddeveloper產品偏好型的,只是調用信息getKey()方法來獲取密鑰)))) – grine4ka 2013-09-18 14:31:12

1

當時無法來測試你的,但我想知道,如果你可以通過使用getView()方法上Preference實現這一目標。然後,一旦你有這個View,使用setOnLongClickListener()

+0

我用CheckboxPreference試了一下,它有一半工作。首選項是可以長時間點擊的,但複選框變得不可點擊,我無法弄清楚如何解決這個問題。 – 2015-03-18 09:11:28