如何为长PreferenceScreen设置滚动位置

时间:2011-04-29 20:49:18

标签: android

Android应用程序有一些非常长的首选项屏幕,它始终在首选项菜单的顶部打开。我知道用户想要在首选项菜单中的位置。如何强制首选项屏幕打开滚动到特定的首选项?

4 个答案:

答案 0 :(得分:2)

我知道这是旧的,所以这个答案仅供参考。

要自动选择给定的屏幕,您只需要setPreferenceScreen()(这适用于预蜂窝非片段PreferenceActivity)。

一旦使用了正确的PreferenceScreen,您确实可以使用getListView().smoothScrollToPosition(position)(但这是一个Froyo +方法),或者您可以使用getListView.setSelection(position)

但如何获得这个职位?

首先,注意陷阱:PreferenceActivity.getListAdapter()不返回实际的ListAdapter,而是一个令人不安地与PreferenceActivity.getListView().getAdapter()不一致的本地实例变量(通常为null)。

其次,尝试使用Preference.getOrder()会返回其父级中Preference对象的顺序,只有在您不使用PreferenceCategories时,才能将该位置用于位置/ strong>因为你需要的是它在PreferenceScreen中的顺序。

如果您使用的是PreferenceCategories,则需要迭代适配器中的项目for (int i = 0; i < adapter.getCount(); i++),直到找到合适的项目并使用其位置。

Android SDK的另一个角落迫切需要引起注意......

答案 1 :(得分:1)

将此功能添加到PreferenceFragment

public void scrollToItem(String preferenceName) {
        ListView listView = ButterKnife.findById(getView(),android.R.id.list);
        Preference preference = findPreference(preferenceName);
        if (preference != null && 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");

答案 2 :(得分:0)

由于PreferenceActivity扩展了ListActivity,您可以调用getListView()来获取包含您的首选项的ListView,然后使用listView.smoothScrollToPosition()滚动到列表中的特定行。我以前没有尝试过这个,但它应该有用。

答案 3 :(得分:0)

您可以只使用scrollToPreference

https://developer.android.com/reference/androidx/preference/PreferenceFragmentCompat#scrollToPreference(androidx.preference.Preference)

示例:

scrollToPreference(preferenceKey)

或:

scrollToPreference(preference)