6

我正在尝试以编程方式打开一个 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”,并将其显示给用户。我研究了这个话题,提供了这个解决方案:

// 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的值更改 'pos'getOrder()也不起作用。

4

2 回答 2

1

我知道这是一个非常古老的线程,但我刚刚遇到了类似的问题,所以在这里我的简短解决方案基于这个

    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);
于 2015-10-10T17:15:23.833 回答
-1

提供不同的解决方案,模拟手指触摸:

使用View.getLocationOnScreen()和/或getLocationInWindow()获取列表项的位置。所以你可以找到awidth和aheight来模拟点击。

    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();
于 2013-03-28T08:51:13.623 回答