Как установить положение прокрутки для long PreferenceScreen

#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 :

https://developer.android.com/reference/androidx/preference/PreferenceFragmentCompat#scrollToPreference(androidx.preference.Предпочтения)

Пример:

 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. кенкорбин, мне нужно то же самое! Смогли ли вы найти решение?