Como abrir o guia de café Expresso
-
21-12-2019 - |
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}"
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());