我有一个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);
}
}
然而,当我运行该程序时,它崩溃并出现错误: “无法创建标签内容,因为无法找到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>
据我所知,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);
}
}
,它不会给出错误并使布局正常。
发生了什么事?为什么我在创建选项卡时不能引用此布局?
答案 0 :(得分:9)
虽然Activity.setContentView采用布局的ID,但TabSpec.setContent采用视图的ID。这意味着您需要传递看似R.id.something
而不是R.layout.something
的ID。
要解决您的特定问题,请在布局中为顶级视图提供一个视图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>
并更新您的来源:
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中的标签示例:
答案 1 :(得分: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);
答案 2 :(得分:5)
您还必须在TabHost
之后使用LayoutInflaterLayoutInflater.from(this).inflate(R.layout.unit_data,tabHost.getTabContentView(),true);
我也坚持了这一点,最后弄明白了。