Как добавить «прослушиватель длинного клика» к предпочтению?

У меня есть PreferenceActivity где я бы хотел динамически добавлять настройки.

При длинном щелчке они должны что-то сделать, однако OnPreferenceClickListener поддерживает только обычные клики, длинные клики.

Есть ли способ реализовать эту функцию, я что-то пропустил?

благодаря

Посмотрите, поможет ли это .


В случае, если связь замирает, вот основная часть сообщения в этой ссылке. Примечание: я ничего не написал.

Встроенный класс предпочтений имеет метод получения кликов, 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 и переопределить bind, чтобы добавить прослушиватель длинного элемента в список, за исключением того, что этот класс является окончательным. Из-за этого я включил следующий код в мой подкласс 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; } }); } } 

Теперь у меня есть подкласс Preference, который реализует View.OnLongClickListener, который автоматически вызывается для длительных кликов:

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

Невозможно проверить для вас на данный момент, но мне интересно, можете ли вы достичь этого, используя метод getView() в Preference . Затем, как только у вас setOnLongClickListener() этот View , используйте setOnLongClickListener() .