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}"
War es hilfreich?

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 View-Hierarchie Tool. Es ist Teil der Android SDK und lebt im Werkzeugverzeichnis.

Sie können es von der Befehlszeile so starten:

generasacodicetagpre.

oder verwenden Sie Android-Studio Menü: Tools> Android> Android-Gerätemonitor. Öffnen Sie dann die Hierarchie-Ansicht-Perspektive aus dem Menü im Gerätemonitor: Fenster> Perspektive öffnen> Hierarchieansicht.

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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top