2009-04-24 5 views
5

Tengo una aplicación utilizando la siguiente distribución:¿Por qué Android TabHost roba el foco de un TextView?

alt text http://img15.imageshack.us/img15/238/screenshot003xbo.png

Cuando el inicio de aplicaciones, la atención se centra en la primera TextView, pero si intenta escribir cualquier letra en él, el foco va directamente a la pestañas. Parece que no soy el único fighting with this issue, y tal vez esto está relacionado con lo siguiente:

http://groups.google.com/group/android-developers/browse_thread/thread/435791bbd6c550a/8022183887f38f4f?lnk=gst&q=tabs+focus#8022183887f38f4f

De todos modos, usted tiene alguna idea de por qué sucede esto? Y por supuesto, cualquier solución sería apreciada.


puedo enviar el siguiente código para evitar la sobrecarga de la pregunta:

El XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
      android:padding="5px" 
      android:orientation="vertical" 
      android:id="@+id/task_edit_panel" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="50" > 
     <LinearLayout android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 
      <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/title" 
       android:textStyle="bold" /> 
      <EditText android:id="@+id/title" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" /> 
     </LinearLayout> 
     <TabHost android:id="@+id/edit_item_tab_host" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
      <TabWidget android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:id="@android:id/tabs" /> 
      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:paddingTop="65px"> <!-- you need that if you don't want the tab content to overflow --> 
       <LinearLayout 
        android:id="@+id/edit_item_date_tab" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:padding="5px" > 
        <TextView android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="date" 
          android:textStyle="bold" /> 
       </LinearLayout> 
       <LinearLayout 
        android:id="@+id/edit_item_geocontext_tab" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:padding="5px" > 
       <TextView android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="lieu" 
          android:textStyle="bold" /> 
       </LinearLayout> 
       <LinearLayout 
        android:id="@+id/edit_item_text_tab" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:padding="5px"> 
       <EditText android:id="@+id/details" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" 
         android:scrollbars="vertical" /> 
       </LinearLayout> 
      </FrameLayout> 
     </TabHost> 
    </LinearLayout> 
    <!-- Bottom pannel with "add item" button --> 
    <LinearLayout 
      android:padding="5px" 
      android:orientation="horizontal" 
      android:layout_weight="1" 
      android:id="@+id/task_edit_panel" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:background="#E7E7E7" > 
      <!-- Let the height set to fill_parent until we find a better way for the layout --> 
      <Button android:id="@+id/item_edit_ok_button" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:text="@string/ok" 
       style="?android:attr/buttonStyleSmall" 
       android:layout_weight="1" /> 
      <Button android:id="@+id/item_edit_cancel_button" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:text="@string/cancel" 
       style="?android:attr/buttonStyleSmall" 
       android:layout_weight="1" /> 
    </LinearLayout> 
</LinearLayout> 

Y el código de Java:

TabHost tab_host = (TabHost) findViewById(R.id.edit_item_tab_host); 
    // don't forget this setup before adding tabs from a tabhost using a xml view or you'll get an nullpointer exception 
    tab_host.setup(); 

    TabSpec ts1 = tab_host.newTabSpec("TAB_DATE"); 
    ts1.setIndicator(getString(R.string.when), getResources().getDrawable(R.drawable.ic_dialog_time)); 
    ts1.setContent(R.id.edit_item_date_tab); 
    tab_host.addTab(ts1); 

    TabSpec ts2 = tab_host.newTabSpec("TAB_GEO"); 
    ts2.setIndicator(getString(R.string.where), getResources().getDrawable(R.drawable.ic_dialog_map)); 
    ts2.setContent(R.id.edit_item_geocontext_tab); 
    tab_host.addTab(ts2); 

    TabSpec ts3 = tab_host.newTabSpec("TAB_TEXT"); 
    ts3.setIndicator(getString(R.string.what), getResources().getDrawable(R.drawable.ic_menu_edit)); 
    ts3.setContent(R.id.edit_item_text_tab); 
    tab_host.addTab(ts3); 

    tab_host.setCurrentTab(0); 

Respuesta

0

Si no está relacionado a ese otro error que señaló (y parece que probablemente) y si está experimentando esto en el G1 (y no en el emulador). Sospecho que su problema es que el foco no se congela antes de que cambie la orientación (cuando pliega el teclado y entra en el modo horizontal) o no se congela después de recrear la vista. Puede intentar Sobrescribir los métodos onSaveInstanceState() y onRestoreInstanceState() de la actividad para guardar/restaurar el enfoque.

6

Estaba enfrentando el mismo tipo de problema con HoneyComb pero encontré una solución muy simple. Así que pensé que podría ser útil que alguien compartiera mi experiencia. Cada vez que se hace clic en una pestaña, la atención se centra en Editar texto y puede escribir con el teclado rígido, pero el teclado nunca aparece. Incluso con código de abajo, que aún no ha resolver el problema:

input1.requestFocusFromTouch(); 
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(input1, InputMethodManager.SHOW_FORCED); 

Solución: En la clase principal en el que está manejando aquí, acaba de escribir a continuación el código de Java:

myTabHost.setOnTabChangedListener(new OnTabChangeListener(){  
    public void onTabChanged(String tabID) {  
     myTabHost.clearFocus(); 
    } 
}); 
0

este ejemplo muestran cómo solucionar este tema:

userNameEditText.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       userNameEditText.requestFocusFromTouch(); 
       return false; 
      } 
     }); 
0

después de añadir todas las especificaciones añadir método requestFocus a su EditarTexto en el archivo java

+1

¿Quiere decir que la solución es derivar una clase de 'EditText', anular el método' requestFocus' y usarlo en lugar del 'EditText' estándar cuando se construye la UI? –