Почему я получаю сообщение об ошибке при попытке установить содержимое tabspec в Android? - PullRequest
5 голосов
/ 31 мая 2010

У меня есть активность 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);
  }
}

Однако, когда я запускаю программу, она вылетает с ошибкой: Msgstr "Не удалось создать содержимое вкладки, так как не удалось найти представление с идентификатором 2130903042". Я не понимаю, в чем проблема, потому что R.layout.unit_data ссылается на файл макета в моем каталоге ресурсов (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>

Насколько я могу судить, unit_data.xml сформирован правильно, и я даже успешно ссылался на него в другом упражнении

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

, который не выдает ошибку и прекрасно отображает макет.

Что происходит? Почему я не могу ссылаться на этот макет при создании вкладки?

Ответы [ 3 ]

9 голосов
/ 31 мая 2010

Пока Activity.setContentView принимает идентификатор макета, TabSpec.setContent принимает идентификатор представления. Это означает, что вам нужно передать идентификатор, который выглядит как R.id.something, а не R.layout.something.

Чтобы решить вашу конкретную проблему, присвойте представлению верхнего уровня в макете идентификатор вида:

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

и обновите ваш источник:

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

Для получения дополнительной информации см. Примеры вкладок в ApiDemos :

7 голосов
/ 05 февраля 2012

Если у вас макет вкладки в другом файле, вы должны надуть 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);
5 голосов
/ 03 января 2011

Вы также должны использовать LayoutInflater после TabHost

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

Я тоже застрял с этим и, наконец, понял это.

...