Android — TabHost / TabWidget

Я новичок в Android и пытаюсь портировать приложение для iOS. К сожалению, у меня возникли проблемы с запуском моей базовой настройки.

Я пытаюсь реализовать навигацию, аналогичную этому руководству: руководство

Это более или менее простой TabHost, содержащий несколько вкладок, но вместо использования

tabHost.addTab(tabHost.newTabSpec("settings").setIndicator("settings").setContent(R.id.tab1));

как в учебнике и что работает, я хотел бы открыть свою вкладку с помощью такого класса:

tabHost.addTab(tabHost.newTabSpec("settings").setIndicator("settings").setContent(new Intent(this, SettingsActivity.class)));

К сожалению, приложение вылетает, когда я нажимаю на вкладку «Настройки».

Это мой код до сих пор:

MainActivity:

package xxx;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;

public class MainActivity extends Activity implements OnTabChangeListener
{

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTabs();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    private void initTabs()
    {
        TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
        tabHost.setup();


        tabHost.addTab(tabHost.newTabSpec("Übersicht").setIndicator("Übersicht").setContent(R.id.tab1)); // <- is working fine
        tabHost.addTab(tabHost.newTabSpec("Einstellungen").setIndicator("Einstellungen").setContent(new Intent(this, SettingsActivity.class))); <- crash

        tabHost.setOnTabChangedListener(this);

        tabHost.setCurrentTab(0);
    }


    @Override
    public void onTabChanged(String tabId) 
    {
        // TODO Auto-generated method stub  
    }
}

Activity_main.xml:

<RelativeLayout xmlns:android=
    xmlns:tools=""
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TabWidget
                android:id="@android: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"
                    android:orientation="horizontal" >

                </LinearLayout>

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

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab3"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="horizontal" >

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab4"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="horizontal" >

                </LinearLayout>                
            </FrameLayout>
        </LinearLayout>
    </TabHost>
</RelativeLayout>

НастройкиАктивность:

package xxx;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SettingsActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        TextView tv = new TextView(this);
        tv.setText("This is tab 2");
        setContentView(tv);
    }   
}

Сообщение об ошибке от LogCat:

10-15 03:52:22.711: W/dalvikvm(889): threadid=1: поток завершается с необработанным исключением (group=0x41465700) 10-15 03:52:22.851: E/AndroidRuntime(889): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 10-15 03:52:22.851: E/AndroidRuntime(889): java.lang.IllegalStateException: Вы забыли вызвать 'public void setup (LocalActivityManager ActivityGroup)'? 10-15 03:52:22.851: E/AndroidRuntime(889): в android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:747) 10-15 03:52:22.851: E/AndroidRuntime(889): в android.widget.TabHost.setCurrentTab(TabHost.java:413) 10-15 03:52:22.851: E/AndroidRuntime(889): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:154) 10-15 03 :52:22.851: E/AndroidRuntime(889): в android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546) 10-15 03:52:22.851: E/AndroidRuntime(889): в android.view. View.performClick(View.java:4240) 10-15 03:52:22.851: E/AndroidRuntime(889): в android.view.View$PerformClick.run(View.java:17721) 10-15 03:52: 22.851: E/AndroidRuntime(889): в android.os.Handler.handleCallback(Handler.java:730) 10-15 03:52:22.851: E/AndroidRuntime(889): в android.os.Handler.dispatchMessage(Handler .java:92) 10-15 03:52:22.851: E/AndroidRuntime(889): в android.os.Looper.loop(Looper.java:137) 10-15 03:52:22.851: E/ AndroidRuntime(889): в android.app.ActivityThread.main(ActivityThread.java:5103) 10-15 03:52:22.851: E/AndroidRuntime(889): в java.lang.reflect.Method.invokeNative(собственный метод) 10-15 03:52:22.851: E/AndroidRuntime(889): в java.lang.reflect.Method.invoke(Method.java:525) 10-15 03:52:22.851: E/AndroidRuntime(889): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 10-15 03:52:22.851: E/AndroidRuntime(889): в com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553) 10-15 03:52:22.851: E/AndroidRuntime(889): в dalvik.system.NativeStart.main(собственный метод)

Я думаю, проблема в том, что моя MainActivity не расширена из ActivityGroup и/или что я не использую LocalActivityManager. Проблема в том, что оба устарели. Что мне нужно изменить, чтобы заставить его работать без использования устаревших методов и классов?

Извините за этот, возможно, простой вопрос, но я ничего не нашел в Google, и я новичок в программировании для Android :).


person user1567896    schedule 15.10.2013    source источник
comment
Первое решение, которое приходит на ум, это определить ли вы эту настройку в своем AndroidManifest ??   -  person Mitesh Shah    schedule 15.10.2013
comment
О, я забыл опубликовать свой манифест, но да, он определен в манифесте   -  person user1567896    schedule 15.10.2013


Ответы (4)


Как вы упомянули, вы должны расширяться от ActivityGroup , но если вам не нужен устаревший класс, вы можете использовать Fragments и FragmentManager : Фрагменты

person Arash GM    schedule 15.10.2013
comment
Я изменил свои классы на Fragment и FragmentActivity, но все равно получаю сообщение об ошибке '10-15 03:52:22.851: E/AndroidRuntime(889): java.lang.IllegalStateException: Вы забыли вызвать 'public void setup (LocalActivityManager ActivityGroup )'?' - person user1567896; 15.10.2013
comment
Наконец-то получилось работать с FragmentTabHost, Fragment, FragmentActivity и FragmantManager, спасибо за подсказку. - person user1567896; 15.10.2013

Попробуй это

 tabHost.addTab(tabHost.newTabSpec("Einstellungen").setIndicator("Einstellungen").setContent(R.id.tab2))); 

Измените свой код следующим образом

   TabHost.TabSpec spec;  // Resusable TabSpec for each tab
Intent intent;  // Reusable Intent for each tab

// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, ArtistsActivity.class);

// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("artists").setIndicator("Artists",
                  res.getDrawable(R.drawable.ic_tab_artists)).setContent(intent);
tabHost.addTab(spec);

// Do the same for the other tabs
intent = new Intent().setClass(this, AlbumsActivity.class);
spec = tabHost.newTabSpec("albums").setIndicator("Albums",
                  res.getDrawable(R.drawable.ic_tab_albums)).setContent(intent);
tabHost.addTab(spec);

См. хороший пример руководства по Android hello-tabwidget.

person NagarjunaReddy    schedule 15.10.2013
comment
Это работает, но, как я уже говорил, я не хочу его использовать. Я хотел бы открыть вкладку с активностью/классом. - person user1567896; 15.10.2013

Сделайте что-нибудь вроде,

TabHost tabHost = getTabHost(); 

    Intent intentHome = new Intent().setClass(MainScreen.this, Home.class);
    TabSpec tabSpecHome = tabHost.newTabSpec("Home").setIndicator("Home").setContent(intentHome);
    tabHost.addTab(tabSpecHome);        
    tabHost.setCurrentTab(0);

Надеюсь это поможет.. :)

person Mitesh Shah    schedule 15.10.2013
comment
getTabHost() принадлежит TabActivity, и это устарело - person user1567896; 15.10.2013
comment
Проверьте это. - person Mitesh Shah; 15.10.2013

Удалить "это" из tabHost.addTab(tabHost.newTabSpec("Einstellungen").setIndicator("Einstellungen").setContent(new Intent(this, SettingsActivity.class)));

и замените на getApplicationContext();

нравится

tabHost.addTab(tabHost.newTabSpec("Einstellungen").setIndicator("Einstellungen").setContent(new Intent(getApplicationContext(), SettingsActivity.class)));
person Shashank Agarwal    schedule 15.10.2013
comment
это не работает, зачем предлагать что-то, что не решает проблему!! - person Abdellah Benhammou; 21.03.2014