2010-05-31 11 views
5

Tengo una actividad en Android en la que estoy usando pestañas.¿Por qué me sale un error al intentar establecer el contenido de una tabspec en android?

public class UnitActivity extends TabActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.unit_view); 

    TabHost tabHost = getTabHost(); 
    TabSpec spec; 

    spec = tabHost.newTabSpec("controls"); 
    spec.setIndicator("Control"); 
    spec.setContent(R.layout.unit_control); 
    tabHost.addTab(spec); 

    spec = tabHost.newTabSpec("data"); 
    spec.setIndicator("Data"); 
    spec.setContent(R.layout.unit_data); 
    tabHost.addTab(spec); 
    } 
} 

Sin embargo, cuando ejecuto el programa se bloquea con el error: "No se pudo crear el contenido de pestaña, porque no pudo encontrar la vista con id 2130903042". No entiendo cuál es el problema, porque R.layout.unit_data se refiere a un archivo de diseño en mi directorio de recursos (res/layout/unit_data.xml)

<?xml version="1.0" encoding="utf-8"?> 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <TableLayout 
     android:stretchColumns="*" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <Spinner android:id="@+id/unit_num" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/choose_unit"/> 
    <TableRow android:padding="2dp"> 
     <TextView 
      android:gravity="right" 
      android:padding="5dp" 
      android:text="@string/Power"/> 
     <TextView android:id="@+id/unit_power" 
      android:layout_span="3" 
      android:gravity="center" 
      android:padding="5dp" 
      android:background="@android:color/white" 
      android:textColor="@android:color/black" 
      android:text="AUTO"/> 
    </TableRow> 
    ... 
    </TableLayout> 
</ScrollView> 

por lo que yo puedo decir es unit_data.xml bien formados e incluso he hecho referencia a él con éxito en otra actividad

class UnitData extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.unit_data); 
    Toast.makeText(this, "Hi from UnitData.onCreate", 5); 
    } 
} 

que no da un error y hace que el diseño muy bien.

¿Qué está pasando? ¿Por qué no puedo hacer referencia a este diseño al crear una pestaña?

Respuesta

9

Mientras Activity.setContentView toma una identificación de un diseño, TabSpec.setContent toma una identificación de una vista. Esto significa que debe pasar una identificación que se parece a R.id.something y no a R.layout.something.

para resolver su problema particular, dan la vista de nivel superior en su diseño una vista id:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/unit_data"> <!-- NOTE THE CHANGE --> 
    ... 
</ScrollView> 

y actualizar su fuente:

public class UnitActivity extends TabActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.unit_view); 

    TabHost tabHost = getTabHost(); 
    TabSpec spec; 

    spec = tabHost.newTabSpec("controls"); 
    spec.setIndicator("Control"); 
    spec.setContent(R.id.unit_control); // NOTE THE CHANGE 
    tabHost.addTab(spec); 

    spec = tabHost.newTabSpec("data"); 
    spec.setIndicator("Data"); 
    spec.setContent(R.id.unit_data); // NOTE THE CHANGE 
    tabHost.addTab(spec); 
    } 
} 

Para obtener más información, ver los ejemplos de tabulación en la ApiDemos:

+0

Gracias a todos por el consejo. Tienes razón, parte de mi problema se debe a que estaba usando una referencia de R.layout (que se parecía mucho a una referencia de identificación que me desanimó). También creo que el ID al que se hace referencia de esta manera debe estar en la vista referenciada por @android: id/tabcontent. Leí mencionar eso en otro lado y mis propias pruebas parecen apoyarlo. – rushinge

5

también tienen que utilizar LayoutInflater después TabHost

LayoutInflater.from (this) .inflate (R.layout.unit_data, tabHost.getTabContentView(), true);

También me quedé atrapado con esto y finalmente lo resolví.

7

Si tiene el diseño de las pestañas en un archivo diferente, debe inflar el XML.

spec = tabHost.newTabSpec("data"); 
spec.setIndicator("Data"); 
// Add the layout to your tab view 
getLayoutInflater().inflate(R.layout.unit_data, tabHost.getTabContentView(), true); 
spec.setContent(R.id.unit_data); 
tabHost.addTab(spec); 
Cuestiones relacionadas