我有一个带有元素列表的对话框,其中每个元素都提供了一个ArrayAdapter:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
ArrayList<String> names = getArguments().getStringArrayList(INTENT_OPTIONS);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_list_item_1, names);
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which){
if (mListener != null){
mListener.onSelectedElement(which);
}
}
};
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.loginActivity_selectVACenter)
.setCancelable(true)
.setAdapter(adapter, listener)
.create();
}
在实施appcompat v7库以合并材质特征之前,我使用以下句子选择了Espresso中的每个元素:
onView(withText("text of the entry"))
.perform(click());
但是在添加这个库之后,这个句子不再起作用了,Espresso无法找到视图并抛出NoMatchingViewException。
有没有其他方法可以访问对话框选项?
答案 0 :(得分:1)
我已经找到了这个可能有用的主题:Check if a dialog is displayed with Espresso
在一个可能的答案中,有一个getRootView()
匹配器:
为了回答问题4,接受的答案没有,我修改了 下面的代码,我在Stack Overflow上找到了这个代码 (link)进行测试 是否显示了Toast。
@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
传入的
id
是您当前显示的View
的ID 对话。您也可以这样编写方法:@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
现在它正在寻找包含特定文本字符串的
View
。像这样使用它:
getRootView(getActivity(), R.id.text_id).perform(click());
首先尝试这个。同样在同一主题中你会发现这个方法:
。onView(withText(R.string.my_title))器InRoot(isDialog())检查(匹配(isDisplayed()));
如果仍然无效,可能会使用onData
匹配器。
每当你有一个ListView,GridView,Spinner和其他适配器 基于视图,你必须使用onData()才能与a进行交互 该列表中的项目。 onData()直接针对提供的数据 通过适配器。这意味着什么,我们马上就会看到。[1]
你可以在这里阅读:
Get started with a simple test using onData