2010-05-31 11 views
5

Ho un'attività Android in cui sto utilizzando le schede.Perché si verifica un errore durante il tentativo di impostare il contenuto di un tabspec in 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); 
    } 
} 

Tuttavia quando si esegue il programma si blocca con l'errore: "Impossibile creare contenuti scheda perché non riusciva a trovare vista con id 2.130.903,042 mila". Non capisco quale sia il problema, perché R.layout.unit_data fa riferimento a un file di layout nel mio indice di risorse (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> 

per quanto posso dire è unit_data.xml ben formate e ho anche fatto riferimento con successo in un'altra attività

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

che non dà un errore e rende il layout più che bene.

Cosa sta succedendo? Perché non posso fare riferimento a questo layout quando creo una scheda?

risposta

9

Mentre Activity.setContentView prende un ID di un Layout, TabSpec.setContent prende un ID di una vista. Ciò significa che devi passare un ID che assomigli a R.id.something e non a R.layout.something.

per risolvere il tuo problema specifico, dare la vista dall'alto di livello nel layout 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> 

e aggiornare la vostra fonte:

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

Per ulteriori informazioni, vedere gli esempi scheda in il ApiDemos:

+0

Grazie mille per il consiglio. Hai ragione, parte del mio problema è perché stavo usando un riferimento a R.layout (che sembrava molto simile a un riferimento di identificazione che mi ha buttato fuori). Penso anche che l'ID di riferimento in questo modo deve essere nella vista a cui fa riferimento @android: id/tabcontent. Ho letto di averlo menzionato altrove e il mio test sembra supportarlo. – rushinge

5

si hanno anche per utilizzare LayoutInflater dopo TabHost

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

Sono anche rimasto bloccato con questo e finalmente lo capisco.

7

Se il layout delle schede è in un file diverso, è necessario gonfiare l'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); 
Problemi correlati