一个相当正常的场景:Android 应用程序有一个首选项活动,从 ListPreference 中选择一个选项会触发代码来更改该 ListPreference 的摘要文本。即:从颜色 ListPreference 中选择“绿色”将通过以下方式将 ListPreference 的摘要文本更改为“绿色”:onPreferenceChange
打回来。
我希望能够使用 Android JUnit 测试来确认这些摘要更改均已正确执行。然而,关于如何做到这一点的信息似乎很少。
我尝试过使用的变体setValue()
在 ListPreference 上,无论是在测试线程中还是通过runOnUiThread()
,没有成功 - 这不会触发对onPreferenceChange()
。我也尝试过getInstrumentation().waitForIdleSync()
打电话后setValue()
,但这也没有成功。
所以,我的问题是:这是如何完成的?
Thanks!
几个小时的工作产生了这个工作解决方案,但我很好奇是否其他人有更好的解决方案。这段代码的灵感来自这个解决方案 https://stackoverflow.com/questions/4805896/how-to-open-or-simulate-a-click-on-a-android-preference-which-was-created-with-x/4869034#4869034类似的问题,但这种情况有两点不同:
- 它旨在供 Android JUnit 使用,这意味着它需要通过以下方式调用 ListPreference UI 点击
runOnUiThread()
.
- 它期望使用偏好类别,这使得查找要单击的位置(相对于整个偏好列表)变得复杂。上述解决方案仅适用于没有偏好类别的情况。
此方法将接受特定 ListPreference 项目的键,以及列表中要单击的项目的位置。然后它将执行该列表项单击,其他代码将执行我正在寻找的检查。
请注意,这需要setActivityInitialTouchMode(true);
要在之前设置getActivity()
调用setUp()
method.
private void clickListPreference(String _listPreferenceKey, int _listItemPos){
final String listPreferenceKey = _listPreferenceKey;
final int listItemPos = _listItemPos;
mActivity.runOnUiThread(
new Runnable() {
public void run() {
// get a handle to the particular ListPreference
ListPreference listPreference= (ListPreference) mActivity.findPreference(listPreferenceKey);
// bring up the dialog box
mActivity.getPreferenceScreen().onItemClick( null, null, getPreferencePosition(), 0 );
// click the requested item
AlertDialog listDialog = (AlertDialog) listPreference.getDialog();
ListView listView = listDialog.getListView();
listView.performItemClick(listView, listItemPos, 0);
}
/***
* Finding a ListPreference is difficult when Preference Categories are involved,
* as the category header itself counts as a position in the preferences screen
* list.
*
* This method iterates over the preference items inside preference categories
* to find the ListPreference that is wanted.
*
* @return The position of the ListPreference relative to the entire preferences screen list
*/
private int getPreferencePosition(){
int counter = 0;
PreferenceScreen screen = mActivity.getPreferenceScreen();
// loop over categories
for (int i = 0; i < screen.getPreferenceCount(); i++){
PreferenceCategory cat = (PreferenceCategory) screen.getPreference(i);
counter++;
// loop over category items
for (int j = 0; j < cat.getPreferenceCount(); j++){
if (cat.getPreference(j).getKey().contentEquals(listPreferenceKey)){
return counter;
}
counter++;
}
}
return 0; // did not match
}
}
);
getInstrumentation().waitForIdleSync();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)