Pergunta

Como posso abrir o guia de café Expresso teste?Eu tentei fazer Espresso.onView(ViewMatchers.withId(R.id.practice_results_tab)).perform(ViewActions.click());, mas isso não quer trabalhar.Em que código eu abri o Layout deste guia.Não é o arquivo XML:

    <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>

O que ID devo usar para abrir o guia?

Erro no 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}"
Foi útil?

Solução

Código Completo

Você realmente precisa adicionar código para nós dar uma resposta adequada.Eu estou supondo aqui que você usou um TabHost e TabWidget na forma como este exemplo: https://maxalley.wordpress.com/2012/10/25/android-creating-a-tab-layout-with-tabhost-and-tabwidget/

Eu criei um exemplo de projeto em https://github.com/hanscappelle/SO-25016397

Sua Atividade poderia parecer como este:

public class 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);

    }

    private void setNewTab(Context context, TabHost tabHost, String tag, int title, int icon, int contentID ){
        TabSpec tabSpec = tabHost.newTabSpec(tag);
        String titleString = getString(title);
        tabSpec.setIndicator(titleString, context.getResources().getDrawable(android.R.drawable.star_on));
        tabSpec.setContent(contentID);
        tabHost.addTab(tabSpec);
    }
}

Eu encontrei um outro exemplo de código na https://maxalley.wordpress.com/2012/10/27/android-styling-the-tabs-in-a-tabwidget/ com um método auxiliar que injeta um ImageView para as guias.

private View getTabIndicator(Context context, int title, int icon) {
        View view = LayoutInflater.from(context).inflate(R.layout.tab_layout, null);
        ImageView iv = (ImageView) view.findViewById(R.id.imageView);
        iv.setImageResource(icon);
        TextView tv = (TextView) view.findViewById(R.id.textView);
        tv.setText(title);
        return view;
    }

Agora fica interessante provocar desta forma, podemos facilmente definir um ID ou uma tag sobre estes injetado View objetos e utilize-as de café Expresso.

Uma solução:Marca o visualizar

Se você adaptar esse auxiliar para aceitar uma tag para cada view helper código será algo parecido com isso:

private View getTabIndicator(Context context, int title, int icon, int viewId, String viewTag) {
        View view = LayoutInflater.from(context).inflate(R.layout.tab_layout, null);
        ImageView iv = (ImageView) view.findViewById(R.id.image_view);
        iv.setImageResource(icon);
        TextView tv = (TextView) view.findViewById(R.id.text_view);
        tv.setText(title);
        tv.setTag(viewTag);
        return view;
    }

Se você usar apenas os ícones que você pode definir o ID no ImageView também.

E o Expresso, clique em código para estes guias:

Espresso.onView(ViewMatchers.withTagValue(Matchers.is((Object)"tab1"))).perform(ViewActions.click());

Solução Alternativa:usando Identificações de Visualização

Se você vai para os IDs de que você precisa essas Identificações para ser definido em algum lugar.Usar um simples Android ficheiro de recursos com algumas definições de ID.

A visão de IDENTIFICAÇÃO do ficheiro de recurso, chamado /values/ids.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="tab1" type="id" />
</resources>

Adaptado auxiliar:

private View getTabIndicator(Context context, int title, int icon, int viewId, String viewTag) {
    View view = LayoutInflater.from(context).inflate(R.layout.tab_layout, null);
    ImageView iv = (ImageView) view.findViewById(R.id.image_view);
    iv.setImageResource(icon);
    TextView tv = (TextView) view.findViewById(R.id.text_view);
    tv.setText(title);
    tv.setId(viewId);
    return view;
}

Se você usar apenas os ícones que você pode definir o ID no ImageView também.

E o Expresso, clique em código para estes guias:

Espresso.onView(ViewMatchers.withId(R.id.tab1)).perform(ViewActions.click());

Sobre TabHosts em geral

Por que você usa esse TabHost em primeiro lugar?Note que esta classe é substituída por agora.Um ViewPager com guias ou a ActionBar poderia ser melhor, dependendo do seu caso de uso.

Use a ferramenta ViewHierarchy

Em casos como esse, o primeiro problema é, muitas vezes, para encontrar a própria vista.Para isso, use o Exibir Hierarquia ferramenta.Faz parte do SDK do android e vive no diretório de ferramentas.

Você pode iniciá-lo a partir da linha de comando como este:

cd ANDROID_SDK_LOCATION/tools
hierarchyviewer

Ou uso Android Studio menu:Ferramentas > Android > Dispositivo Android Monitor.Em seguida, abra a Exibição da Hierarquia perspectiva a partir do menu no monitor de dispositivo:Janela > Abrir Perspectiva > Exibição De Hierarquia .

Eu prefiro a primeira opção, só porque o Dispositivo de Monitor demais para as nossas intenções.

Agora use o modo de Exibição de Layout em combinação com as Propriedades de Exibição vista para localizar a IDENTIFICAÇÃO e as marcas do modo de exibição que você deseja.

Algumas instruções sobre esta ferramenta: http://developer.android.com/tools/debugging/debugging-ui.html

Outras dicas

a única coisa que funciona para mim é:

public void clickOnTab(String tabText) {    
    Matcher<View> matcher = allOf(withText(tabText),
                                  isDescendantOfA(withId(R.id.ll_tab_container)));
    onView(matcher).perform(click());    
}

onde ll_tab_container é o linearlayout para o meu guia personalizar o layout.e se você tivesse uma aba chamada "compras", em seguida, você iria passar, que como o tabText.

onView(withText("o Seu guia de etiqueta")).executar(clique em (a))

Também é possível definir uma marca em sua guia de texto sem usar um personalizado método do indicador.Você pode fazer isso acessando o guia do TextView depois de ter sido criado.

Usando o MainActivity a partir de hcpl o exemplo de código, que seria algo parecido com isto:

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");
    }
}

Em seguida, no seu café de teste, você pode acessar as guias como este:

onView(withTagValue(Matchers.is((Object)"TAG_TAB_TWO"))).perform(click());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top