我正在尝试以编程方式打开一个ListPreference,它存在于PreferenceCategory中。 XML结构类似于:
<PreferenceScreen
android:key="pref_screen" >
<PreferenceCategory
android:title="Category"
andorid:key="pref_category">
<ListPreference
android:key="pref_list"
android:title="List" />
</PreferenceCategory>
</PreferenceScreen>
我的目标是以编程方式打开“pref_list”,并将其显示给用户。我查看了this主题,提供了这个解决方案:
// the preference screen your item is in must be known
PreferenceScreen screen = (PreferenceScreen) findPreference("pref_screen");
// the position of your item inside the preference screen above
int pos = findPreference("pref_list").getOrder();
// simulate a click / call it!!
screen.onItemClick( null, null, pos, 0 );
这适用于没有PreferenceCategory的PreferenceScreen,但我无法让它适用于我的情况(当ListPreference位于PreferenceCategory中时)。
如何根据我的情况修改此内容?或者还有其他解决方案吗?
我在PreferenceCategory中找不到类似于PreferenceScreen的onItemClick()
的方法。更改我的PreferenceCategory的getOrder()
值的'pos'也不起作用。
答案 0 :(得分:1)
我知道这是一个非常古老的主题,但我刚遇到了类似的问题,所以我的简短解决方案基于this一个
ListAdapter listAdapter = getPreferenceScreen().getRootAdapter();
for (int itemNumber = 0; itemNumber < listAdapter.getCount(); itemNumber++)
if (listAdapter.getItem(itemNumber).equals(findPreference("pref_list")))
getPreferenceScreen().onItemClick(null, null, itemNumber, 0);
答案 1 :(得分:-1)
提供不同的解决方案,模拟手指触摸:
使用View.getLocationOnScreen()
和/或getLocationInWindow()
获取列表项的位置。因此,您可以找到width
和height
来模拟点击。
MotionEvent me=MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, width, height, 0);
rootView.dispatchTouchEvent(me);
me=MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, width, height, 0);
rootView.dispatchTouchEvent(me);
me.recycle();