为什么我在尝试设置android中的tabspec内容时出错?

rus*_*nge 5 layout tabs android view

我有一个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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该程序时,它崩溃并出现错误:"无法创建选项卡内容,因为找不到ID为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>
Run Code Online (Sandbox Code Playgroud)

据我所知,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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这不会给出错误并使布局很好.

这是怎么回事?为什么在创建选项卡时无法引用此布局?

Tim*_*ger 9

Activity.setContentView采用布局的id时,TabSpec.setContent采用View的id.这意味着你需要传递一个看似R.id.something和不相似的id R.layout.something.

要解决您的特定问题,请在布局中为顶级视图提供视图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>
Run Code Online (Sandbox Code Playgroud)

并更新您的来源:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅ApiDemos中的选项卡示例:


sww*_*314 7

如果将选项卡布局放在不同的文件中,则必须对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);
Run Code Online (Sandbox Code Playgroud)


小智 5

您还必须在TabHost之后使用LayoutInflater

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

我也坚持了这一点,最后弄清楚了.