Wie öffnen Sie die Registerkarte in Espresso
-
21-12-2019 - |
Frage
Wie kann ich den Tab im Espresso-Test öffnen?Ich habe versucht zu tun Espresso.onView(ViewMatchers.withId(R.id.practice_results_tab)).perform(ViewActions.click());
, aber das funktioniert nicht.In diesem Code habe ich das Layout dieser Registerkarte geöffnet.Da ist die XML-Datei:
<TabHost
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/practice_tabHost">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/practice_settings_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:id="@+id/practice_results_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
Welche ID soll ich verwenden, um den Tab zu öffnen?
Fehler im Logcat:
Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
Target view: "LinearLayout{id=2131296384, res-name=practice_results_tab, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}"
Lösung
Abgeschlossener Code
Sie müssen wirklich Code für uns hinzufügen, um eine richtige Antwort anzugeben. Ich vermute hier, dass Sie in diesem Beispiel einen Tabhost- und Tabwidget verwendet haben. mit-tabhost-and-tabwidget / "rel=" noreeferer "> https://maxalley.wordpress.com/2012/10/25/Android-creating-a-tab-layout-with-tabhost-und-tabwidget/ < / a>
Ich habe ein Beispielprojekt in https://github.com/hanscappelle/so-25016397 < / a>
Ihre Aktivität könnte dann so aussehen:
generasacodicetagpre.Ich habe ein weiteres Codebeispiel bei https://maxalley.wordpress.com/2012/10/27/Android-styling-th-tabs-in-a-A-tabwidget/ mit einer Helfermethode, die einen generationspoLDICETAGCODE für die Laschen einspritzt.
generasacodicetagpre. Jetzt wird es auf diese Weise interessante Ursache auf diese Weise, auf die wir problemlos eine ID oder ein Tag auf diesen injizierten ImageView
-Objekten einstellen und diese in Espresso verwenden.
Eine Lösung: Tag der Ansicht
Wenn Sie sich anpassen, dass Helper, um ein Tag für jeden View-Helper-Code anzunehmen, so etwas aussehen:
generasacodicetagpre.Wenn Sie nur Symbole verwenden, können Sie die ID auf dem ImageView auch einstellen.
und der Espresso-Code, um auf diese Registerkarten zu klicken:
generasacodicetagpre.Alternative Lösung: Verwenden von View-IDS
Wenn Sie für IDs gehen, benötigen Sie diese IDs, um irgendwo definiert zu werden. Verwenden Sie eine einfache Android-Ressourcendatei mit einigen ID-Definitionen.
Die Ansicht-ID-Ressourcendatei, benannte /Values/ids.xml:
generasacodicetagpre.der angepasste Helfer:
generasacodicetagpre.Wenn Sie nur Symbole verwenden, können Sie die ID auf dem ImageView auch einstellen.
und der Espresso-Code, um auf diese Registerkarten zu klicken:
generasacodicetagpre.Über Tabosts im Allgemeinen
Warum haben Sie dieses Tabhost an erster Stelle benutzt? Beachten Sie, dass diese Klasse inzwischen veraltet ist. A SehenPager mit Tabs oder Die ActionBar ist möglicherweise bessere Optionen, je nachdem Sie in Abhängigkeit von Ihrem Anwendungsfall.
Verwenden Sie das Ansichtshierarchy-Werkzeug
In solchen Fällen ist das erste Problem oft, um die richtige Ansicht zu finden. Hierfür verwenden Sie die
Sie können es von der Befehlszeile so starten:
generasacodicetagpre. oder verwenden Sie
Ich bevorzuge die erste Option, nur weil der Gerätemonitor für unsere Absichten viel zu viel tut.
Verwenden Sie nun die Layoutansicht in Kombination mit der Ansicht der Ansicht Ansicht, um die ID- und Tags der gewünschten Ansicht zu finden.
Einige Anweisungen zu diesem Tool: http://developer.android.com/ Werkzeuge / Debugging / Debugging-ui.html
Andere Tipps
Das einzige, was für mich funktioniert, ist:
generasacodicetagpre. wo ll_tab_container
das linearlayout für mein benutzerdefiniertes Tab-Layout ist.Und wenn Sie eine Registerkarte "Shopping" hatten, würden Sie das als Tabtext übergeben.
onview (mittext ("your tab label")). FORMEN (CLICK ())
Es ist auch möglich, ein Tag für Ihren Tabulatortext festzulegen, ohne eine benutzerdefinierte Indikatormethode zu verwenden.Sie tun dies, indem Sie auf die Registerkarten zugreifen TextView
nachdem es erstellt wurde.
Mit dem MainActivity
aus dem Beispielcode von hcpl würde das ungefähr so aussehen:
public MainActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabHost = getTabHost();
// setNewTab(context, tabHost, tag, title, icon, contentID);
this.setNewTab(this, tabHost, "tab1", R.string.textTabTitle1, R.drawable.ic_tab_settings, R.id.practice_settings_tab);
this.setNewTab(this, tabHost, "tab2", R.string.textTabTitle2, R.drawable.ic_tab_results, R.id.practice_results_tab);
// Set custom tag on first tab
View tabView1 = tabHost.getTabWidget().getChildAt(0);
TextView tabView1Text = (TextView) signUpTabView.findViewById(android.R.id.title);
signUpTextTab.setTag("TAG_TAB_ONE");
// Set custom tag on second tab
View tabView2 = tabHost.getTabWidget().getChildAt(1);
TextView tabView1Text = (TextView) signUpTabView.findViewById(android.R.id.title);
signUpTextTab.setTag("TAG_TAB_TWO");
}
}
Dann könnten Sie in Ihrem Espresso-Test wie folgt auf die Registerkarten zugreifen:
onView(withTagValue(Matchers.is((Object)"TAG_TAB_TWO"))).perform(click());