hoshiKuzu
hoshiKuzu

Reputation: 915

NullPointerException while displaying anything in a tab

I am trying to make a tabed interface within the same actvity. this is my main.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+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">
      <AnalogClock android:id="@+id/tab1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
      />
      <Button android:id="@+id/tab2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="A semi-random button"
      />
    </FrameLayout>
  </LinearLayout>
</TabHost>

dummy.xml:

<?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="fill_parent"
      android:orientation="vertical" >

      <RatingBar
          android:id="@+id/ratingBar1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />

  </LinearLayout>

and my activity:

public class LActivity extends Activity {


 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);


     TabHost tabs=(TabHost)findViewById(R.id.tabhost);
     tabs.setup();

   tabs.addTab(tabs.newTabSpec("tag1").setIndicator("1").setContent(R.id.tab1));
   tabs.addTab(tabs.newTabSpec("tag2").setIndicator("2").setContent(R.id.tab2));

the above code works, but if you change R.id.tab2 to R.layout.dummy or R.id.ratingBar1, it throws a nullpointerexception.

i intend to display dummy.xml in a tab.

Upvotes: 0

Views: 280

Answers (1)

K-ballo
K-ballo

Reputation: 81349

The reason that R.id.tab2 works and R.layout.dummy doesn't is that R.id.tab2 is part of the Activity content view as it is defined in the layout set to it with setContentView.

You can't use a layout-id where a view-id is expected, and thats why R.layout.dummy doesn't work. And you can't expect it to work when using R.id.ratingBar1 as is not part of the Activity content, and how would the activity know where to get that view? Remember you could have several different layouts using an id ratingBar1.

What you need to do is place your dummy layout within @android:id/tabcontent. You can do this with just an <include> element. Otherwise, you need to inflate the layout yourself and use the resulting View as an argument to setContent.

Upvotes: 6

Related Questions