4

我正在编写一个 android 程序,其中我有一个使用选项卡的活动。

活动

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

  TabHost tabHost = getTabHost();
  TabSpec spec;
  Resources res = getResources();

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

  spec = tabHost.newTabSpec("controls");
  spec.setIndicator("Control", res.getDrawable(R.drawable.ic_tab_equalizer));
  spec.setContent(R.id.txtview);
  tabHost.addTab(spec);
}

}

R.layout.unit_view 引用的 XML

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
  <TabWidget android:id="@android:id/tabs"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"/>
    <FrameLayout android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
      <TextView android:id="@+id/txtview"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:gravity="bottom"
          android:text="nullpointer this!" />
    </FrameLayout>
  </LinearLayout>
</TabHost>

据我所见,我正在做与我在 android sdk 的 tabs1 api 示例中看到的相同的事情。我试过“getLayoutInflator()”而不是“LayoutInflator.from(this)”,结果相同。

如果我用“setContentView(R.layout.unit_view)”替换 LayoutInflater 行,我的程序不会因空指针异常而崩溃,但我的内容完全是空白和空的。我得到了标签,就是这样。

我已经检查以确保 R.layout.unit_view 和 tabHost 在运行 LayoutInflater 行时不为空,并且它们似乎很好。它们肯定不是空的。我还检查以确保 LayoutInflater.from(this) 返回一个有效的布局充气对象,并且确实如此。

指示错误的 logcat 说

E/AndroidRuntime(541):java.lang.NullPointerException
 E/AndroidRuntime(541):在 android.widget.TabWidget.dispatchDraw(TabWidget.java:206)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.View.draw(View.java:6538)
 E/AndroidRuntime(541): 在 android.widget.FrameLayout.draw(FrameLayout.java:352)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1531)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.ViewGroup.drawChild(ViewGroup.java:1529)
 E/AndroidRuntime(541):在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
 E/AndroidRuntime(541):在 android.view.View.draw(View.java:6538)
 E/AndroidRuntime(541): 在 android.widget.FrameLayout.draw(FrameLayout.java:352)
 E/AndroidRuntime(541):在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830)
 E/AndroidRuntime(541):在 android.view.ViewRoot.draw(ViewRoot.java:1349)
 E/AndroidRuntime(541):在 android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
 E/AndroidRuntime(541):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
 E/AndroidRuntime(541): 在 android.os.Handler.dispatchMessage(Handler.java:99)
 E/AndroidRuntime(541):在 android.os.Looper.loop(Looper.java:123)
 E/AndroidRuntime(541): 在 android.app.ActivityThread.main(ActivityThread.java:4363)
 E/AndroidRuntime(541): 在 java.lang.reflect.Method.invokeNative(Native Method)
 E/AndroidRuntime(541):在 java.lang.reflect.Method.invoke(Method.java:521)
 E/AndroidRuntime(541):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
 E/AndroidRuntime(541):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
 E/AndroidRuntime(541):在 dalvik.system.NativeStart.main(本机方法)
 I/Process (61):发送信号。PID:541 SIG:3
 I/dalvikvm(541):threadid=7:对信号 3 做出反应
 I/dalvikvm(541):将堆栈跟踪写入“/data/anr/traces.txt”

有人知道如何在不使应用程序崩溃的情况下将此内容放入选项卡吗?我的实际程序更复杂,并且有多个选项卡,但我将其简化为这一点,试图找出它崩溃的原因,但它仍然崩溃,我不知道为什么。

如果我不使用 LayoutInflator,我的程序不会崩溃,但我也没有得到任何内容,只有标签。

4

4 回答 4

20

对于那些使用不在 TabActivity 内的 TabHost 的人,请务必调用 TabHost.setup()。这是它的文档:http://developer.android.com/reference/android/widget/TabHost.html#setup() 当您尝试将标签添加到您的标签主机时,不这样做会导致 NullPointerException。

本教程没有提到这一点,所以我想我会提请你注意,以节省你们寻找它的时间。

于 2011-06-05T13:47:51.743 回答
1

这对我有用:

tabHost = getTabHost();

        tabHost.addTab(tabHost.newTabSpec("upcoming").setIndicator(
                getResources().getString(R.string.upcoming)).setContent(R.id.cell1));

部分 XML

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent" android:layout_height="wrap_content" />
        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent" android:layout_height="fill_parent">
            <include android:id="@+id/cell1"
                layout="@layout/my_layout_file" />
             <!-- another include for cell2, and the closing tags -->
于 2010-05-31T12:13:19.133 回答
0

只是想根据这里的陈述提供一些想法:

http://code.google.com/p/android/issues/detail?id=14929

如果您在加载数据之前尝试绘制 TabWidget,则会导致崩溃。为了防止这种情况,只需使用您的异步任务/处理程序,不仅要加载数据,还要设置内容视图。当然,您可以在数据加载过程中使用其他视图或进度对话框,只是暂时不要显示选项卡持有者。

于 2011-09-26T07:55:22.753 回答
0

年!您需要致电:

TabHost.setup()

在调用方法之前。如果不是,TabHost 的 TabWidget 应该为空。我犯了这个错误很久了。

于 2012-09-04T02:51:43.080 回答