2011-04-29 118 views
2

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

回答

0

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

+0

不幸的是,这是一个子屏幕,而不是主要活动画面。所以现在的问题是,我怎样才能获得与PreferenceScreen相关的视图或活动。我试图将其子类并覆盖bind()方法,但是darn类声明为final,不能被子类化:( 其他任何明智的想法???? – kencorbin 2011-05-12 01:20:40

+0

当你说子屏幕时,你是什么意思?一个完全不同的PreferenceScreen,或者它是PreferenceScreen的子视图? – BigFwoosh 2011-05-12 13:47:32

+0

kencorbin,我需要同样的东西!你能找到解决方案吗? – 2011-10-26 02:10:55

2

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

要自动选择给定的屏幕,你所要做的就是setPreferenceScreen()(这是用于蜂窝前非Fragment PreferenceActivity)。一旦你在正确的PreferenceScreen上,你确实可以使用getListView().smoothScrollToPosition(position)(但这是一个Froyo +方法),或者你可以使用getListView.setSelection(position)

但是如何获得这个位置?

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

其次,试图用Preference.getOrder()返回其父,内优先对象的顺序是你想,因为你需要使用的位置只有当你不使用PreferenceCategories什么是它的内部秩序PreferenceScreen。

如果您正在使用PreferenceCategories,你需要(遍历适配器中的项目for (int i = 0; i < adapter.getCount(); i++),直到找到合适的人,并使用它的位置。

了Android SDK的另一个角落中的迫切需要一些关注...

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");