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>

私が見る限り、私はandroidsdkのtabs1apiサンプルで見たのと同じことをしています。「LayoutInflator.from(this)」の代わりに「getLayoutInflator()」を試しましたが、同じ結果になりました。

LayoutInflaterの行を「setContentView(R.layout.unit_view)」に置き換えると、プログラムはnullポインター例外でクラッシュしませんが、コンテンツは完全に空白で空になります。タブが表示され、それだけです。

R.layout.unit_viewとtabHostがLayoutInflater行を実行するときにヌルではなく、問題がないように見えることを確認しました。それらは間違いなくnullではありません。また、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(ネイティブメソッド)で
 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 /プロセス(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を描画しようとすると、TabWidgetがクラッシュします。これを防ぐには、非同期タスク/ハンドラーを使用して、データをロードするだけでなく、コンテンツビューも設定します。もちろん、データの読み込みプロセス中に他のビューまたは進行状況ダイアログを使用することもできますが、タブホルダーはまだ表示しないでください。

于 2011-09-26T07:55:22.753 に答える
0

年!電話する必要があります:

TabHost.setup()

メソッドを呼び出す前に。そうでない場合は、TabHostのTabWidgetをnullにする必要があります。私は長い間この間違いを犯しました。

于 2012-09-04T02:51:43.080 に答える