2012-03-29 4 views
0

Я пытаюсь заставить эту TabHost работать. Когда я добавляю TabHost в макет xml и запускаю программу, я могу видеть различный контент для каждой вкладки, уложенной друг на друга. Это говорит мне, что макет работает правильно. Затем я добавляю свой код спецификации в действие, а затем закрывает программу на эмуляторе, когда я перехожу к этому экрану.
Так вот мой XML:TabHost android не работает правильно

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

<TextView 
    android:id="@+id/tWelcome" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Large Text" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<Button 
    android:id="@+id/bNewTask" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Add Task" /> 

<TabHost 
    android:id="@+id/myTabs" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <TabWidget 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 
     </TabWidget> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <LinearLayout 
       android:id="@+id/tab1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" > 

       <ListView 
        android:id="@+id/listView" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" > 
       </ListView> 
      </LinearLayout> 

      <LinearLayout 
       android:id="@+id/tab2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" > 

       <TextView 
        android:id="@+id/tTest" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Test" 
        android:textAppearance="?android:attr/textAppearanceLarge" /> 
      </LinearLayout> 
     </FrameLayout> 
    </LinearLayout> 
</TabHost> 

</LinearLayout> 

Вот теперь мой код Активность: (Единственная часть, которая имеет значение ...)

  welcomeName = (TextView) findViewById(R.id.tWelcome); 
    Test = (TextView) findViewById(R.id.tTest); 
    newTask = (Button) findViewById(R.id.bNewTask); 
    myTask = (ListView) findViewById(R.id.listView); 
    TabHost th = (TabHost) findViewById(R.id.myTabs); 

    welcomeName.setText("Welcome " + ToDoActivity.myUser.getName() + "!"); 

    th.setup(); 
    TabSpec specs = th.newTabSpec("tag1"); 
    specs.setContent(R.id.tab1); 
    specs.setIndicator("All"); 
    th.addTab(specs); 
    specs = th.newTabSpec("tag2"); 
    specs.setContent(R.id.tab2); 
    specs.setIndicator("Personal"); 
    th.addTab(specs); 
+0

почему бы не использовать 'TabLayout' вместо' TabHost'? –

ответ

0

А возможности пары приходят на ум.

Если вы используете TabActivity (это не требование, но упрощает), то табус должен иметь android:id="@android:id/tabhost" в качестве идентификатора.

Я также видел, как он сказал, что tabhost должен быть корневым узлом. Я не могу подтвердить это, используя документы Android. Я, вероятно, сделаю это изменение после того, как все другие проспекты не сработают (или кто-то подтверждает, что это правда).

Если вы используете TabActivity, вам не нужно ссылаться на tabhost по id или использовать метод setup(). Я вижу, что вы используете метод setup(), но я не могу сказать, является ли ваша активность TabActivity. Если это так, возможно, это вызывает вашу проблему.

Ниже приведен метод, который я использую для настройки макета вкладки, и он работает для меня. Обратите внимание, что это предполагает, что tabhost является корневым узлом макета, и он имеет android:id/tabhost как id, и это TabActivity. Код

tabhost:

public class Tabs extends TabActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.your_layout); 

     TabHost tabHost = getTabHost(); 
     TabHost.TabSpec spec; 

     spec = tabHost.newTabSpec("tag1").setIndicator("All").setContent(R.id.tab1); 
     tabHost.addTab(spec); 
     spec = tabHost.newTabSpec("tag2").setIndicator("Personal").setContent(R.id.tab2); 
     tabHost.addTab(spec); 
    } 
} 

Надеется, что это помогает! (Обязательно нажмите галочку, чтобы принять ответ, если он решает вашу проблему).

+0

getTabHost() не метод, который я определил. Я могу заставить этот метод вернуть идентификатор TabHost или что-то еще? – user433047

+0

Если вы расширяете TabActivity, это метод оттуда. – Barak

+0

Обратите внимание, что TabActivity устарела. Я бы использовал ActionBarSherlock http://actionbarsherlock.com/ и использовал только новые API ActionBar для создания вкладок. Это делает все намного проще, особенно переходя в Ice Cream Sandwich, который получит много новых устройств в ближайшие полгода ... – Janusz

0

Это страница Android учебник для вкладок: http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

Он содержит информацию и требования о вкладках и дает много примеров кода. После этого вы сможете копировать-вставлять, а затем редактировать.

В частности, я бы изменить идентификаторы для всех Tab элементов, чтобы быть предлагаемым Android идентификаторов:

android:id/tabhost 
android:id/tabs 
android:id/tabcontent 
Смежные вопросы