#android
#Android
Вопрос:
В приложении Android есть несколько очень длинных экранов предпочтений, которые всегда открываются в верхней части меню предпочтений. У меня есть некоторое представление о том, где пользователь хочет находиться в меню предпочтений. Как я могу заставить экран предпочтений открываться с прокруткой до определенного элемента предпочтений?
Ответ №1:
Я знаю, что это старый ответ, поэтому этот ответ просто для справки.
Чтобы автоматически выбрать данный экран, все, что вам нужно сделать, это setPreferenceScreen()
(это для pre-Honeycomb non-Fragment PreferenceActivity).
Как только вы окажетесь на правильном экране предпочтений, вы действительно можете использовать getListView().smoothScrollToPosition(position)
(но это метод Froyo ), или вы можете использовать getListView.setSelection(position)
.
Но как получить положение?
Во-первых, следите за ловушкой: PreferenceActivity.getListAdapter()
возвращает не фактический ListAdapter, а локальную переменную экземпляра, которая, к сожалению, не синхронизирована с PreferenceActivity.getListView().getAdapter()
(и обычно равна нулю).
Во-вторых, попытка использовать Preference.getOrder()
возвращает порядок объекта Preference внутри его родительского объекта, который вы хотите использовать для позиции, только если вы не используете PreferenceCategories
, поскольку вам нужен его порядок на экране предпочтений.
Если вы используете категории предпочтений, вам нужно перебирать элементы в адаптере ( for (int i = 0; i < adapter.getCount(); i )
пока не найдете нужный и не используете его положение.
Еще один аспект Android SDK, который остро нуждается в некотором внимании…
Ответ №2:
Вы можете просто использовать scrollToPreference
:
Пример:
scrollToPreference(preferenceKey)
или:
scrollToPreference(preference)
Ответ №3:
Добавьте эту функцию в свой PreferenceFragment
public void scrollToItem(String preferenceName) {
ListView listView = ButterKnife.findById(getView(),android.R.id.list);
Preference preference = findPreference(preferenceName);
if (preference != null amp;amp; listView != null) {
for (int i = 0; i < listView.getAdapter().getCount(); i ) {
Preference iPref = (Preference) listView.getAdapter().getItem(i);
if (iPref == preference) {
listView.setSelection(i);
break;
}
}
}
}
Допустим, у вас есть settings.xml с помощью этого
<Preference
android:icon="@drawable/ic_action_email"
android:key="emailSupport"
android:title="@string/email_support" />
Вы можете вызвать
scrollToItem("emailSupport");
Примечание: Возможно, вам потребуется заменить listView.setSelection(i)
на listView.smoothScrollToPosition(i)
Комментарии:
1. Ваше решение сработало для меня, но мне пришлось заменить ListView.setSelection (i); на ListView.smoothScrollToPosition (i); чтобы оно заработало. Обратите внимание, что я не использую фрагменты в этом приложении.
Ответ №4:
Поскольку PreferenceActivity расширяет ListActivity, вы можете вызвать getListView()
, чтобы получить ListView, содержащий ваши предпочтения, а затем использовать listView.smoothScrollToPosition()
для прокрутки до определенной строки в списке. На самом деле я не пробовал этого раньше, но это должно сработать.
Комментарии:
1. К сожалению, это дополнительный экран, а не основной экран активности. Итак, теперь возникает вопрос, как я могу получить представление или действие, связанные с PreferenceScreen. Я попытался подклассировать его и переопределить метод bind (), но класс darn объявлен окончательным и не может быть подклассирован : (Есть другие яркие идеи????
2. Когда вы говорите subscreen, что вы имеете в виду? Это совершенно другой PreferenceScreen или это подпросмотр PreferenceScreen?
3. кенкорбин, мне нужно то же самое! Смогли ли вы найти решение?