幾個小時的工作產生了這個工作解決方案,但我很好奇,如果其他人有更好的解決方案。這段代碼的靈感來自this solution到類似的問題,但這種情況下,有兩種不同的方式:
- 它適用於搭載Android JUnit的,這意味着它需要調用ListPreference UI通過
runOnUiThread()
點擊使用。
- 它預計會有偏好類別在使用,這使查找位置(相對於整個偏好列表)變得複雜。上述解決方案僅適用於沒有偏好類別的情況。
該方法將接受特定ListPreference項目的關鍵字,以及要點擊的項目在列表中的位置。然後它會執行該列表項目單擊,其他代碼將執行我正在查找的檢查。
請注意,這需要在setUp()
方法中調用getActivity()
之前設置setActivityInitialTouchMode(true);
。
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();
}
自從findPreference()方法被描述以來,此代碼似乎不適用於基於現代片段的偏好活動。您是否嘗試將您的代碼遷移到新的首選項體系結構。 – saurav