使用TabHost和多个片段创建Android应用

时间:2014-01-31 07:26:56

标签: android android-fragments fragment android-tabhost

我一直在尝试创建一个包含标签的基本Android应用,点击后会加载一个新片段 - 每个片段都是一个单独的xml文件。我想使用TabHost而不是活动栏选项卡。我一直在浏览网上的许多教程,并在stackoverflow上发帖,但无济于事。大多数问题和教程都在讨论片段或标签,但不是两个主题。提前感谢您的建议。

我想尝试一个非常基本的应用程序,其中包含:

  • 输入一个数字的一​​个片段 - xml file_1(第一个标签)
  • 一个片段,用于在TextView中显示数字 - xml file_2(第二个标签页)

2 个答案:

答案 0 :(得分:0)

试试这个

您的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TabHost
        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:orientation="vertical" >


            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1" >

                <FrameLayout
                    android:id="@+id/tab_1"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="0dip"
                android:layout_marginRight="0dip"
                android:layout_weight="0" />
        </LinearLayout>
    </TabHost>

</LinearLayout>

在你的活动onCreate

mTabHost = (TabHost)findViewById(android.R.id.tabhost);
        mTabHost.setOnTabChangedListener(this);
        mTabHost.setCurrentTab(0);
        setupTabs();

setupTabs()方法

private void setupTabs() {
        mTabHost.setup();
        setupTab(new TextView(this), "Tab1");
        setupTab(new TextView(this), "Tab2");
            setupTab(new TextView(this), "Tab3");
        mTabHost.getTabWidget().setDividerDrawable(R.drawable.empty);//not necessery

    }

setupTab()方法//设置单个标签

private void setupTab(final View view, final String tag) {
        View tabview = createTabView(mTabHost.getContext(), tag);

        TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabview).setContent(new TabContentFactory() {
            public View createTabContent(String tag) {
                return view;
            }
        });
        mTabHost.addTab(setContent);

    }

createTabView方法

private static View createTabView(final Context context, final String text) {
        int resouceId = R.layout.tabs_bg;
        if(text.equals("Tab1")) {
            resouceId = R.layout.tab_1_layout;
        } else if(text.equals("Tab2")) {
            resouceId = R.layout.tab_2_layout;
        }
        View view = LayoutInflater.from(context).inflate(resouceId, null);
        return view;
    }

onTabChanged方法

@Override
    public void onTabChanged(String tabId) {
        Log.d("TAB_CHANGE","onTabChanged(): tabId=" + tabId);
        updateTab(tabId, R.id.tab_1,new YourFragment());
    }

public void updateTab(String tabId, int placeholder,Fragment fragment) {
        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction()
        .replace(placeholder,fragment, tabId)
        .commit();
    }

答案 1 :(得分:0)

首先,感谢deniz让我足够接近正确的解决方案,我可以完成一个有效的项目。现在,这应该更接近功能。我将名称更改为通用名称,但希望一切都按预期工作,并足以帮助您了解正在发生的事情。

TabHostActivity(您的主要活动):

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;

public class TabHostActivity extends FragmentActivity implements TabHost.OnTabChangeListener
{
    private static final String TAG = "TabHostActivity";

    private TabHost tabHost;

    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_tabhost);

        tabHost = (TabHost) findViewById(android.R.id.tabhost);
        tabHost.setOnTabChangedListener(this);
        tabHost.setCurrentTab(0);
        setupTabs();
    }

    private void setupTabs()
    {
        tabHost.setup();
        setupTab(new TextView(this), "tab1");
        setupTab(new TextView(this), "tab2");
        setupTab(new TextView(this), "tab3");
        setupTab(new TextView(this), "tab4");
    }

    private void setupTab(final View view, final String tag)
    {
        View tabview = createTabView(tabHost.getContext(), tag);

        TabHost.TabSpec setContent = tabHost.newTabSpec(tag)
                .setIndicator(tabview)
                .setContent(new TabHost.TabContentFactory()
                {
                    public View createTabContent(String tag)
                    {
                        return view;
                    }
                });
        tabHost.addTab(setContent);
    }

    /**
     * Return the view for the individual tabs, the tab view being set is identified by tabId.
     *
     * @param context
     * @param tabId
     * @return
     */
    private static View createTabView(final Context context, final String tabId)
    {
        int resourceId;
        if (tabId.equals("tab1"))
        {
            resourceId = R.layout.tab1;
        }
        else if (tabId.equals("tab2"))
        {
            resourceId = R.layout.tab2;
        }
        else if (tabId.equals("tab3"))
        {
            resourceId = R.layout.tab3;
        }
        else
        {
            resourceId = R.layout.tab4;
        }

        return LayoutInflater.from(context).inflate(resourceId, null);
    }

    @Override
    public void onTabChanged(String tabId)
    {
        Log.d(TAG, "onTabChanged(): tabId=" + tabId);

        if (tabId.equalsIgnoreCase("tab1"))
        {
            updateTab(android.R.id.tabcontent, new tab1(), tabId);
        }
        else if (tabId.equalsIgnoreCase("tab2"))
        {
            updateTab(android.R.id.tabcontent, new tab2(), tabId);
        }
        else if (tabId.equalsIgnoreCase("tab3"))
        {
            updateTab(android.R.id.tabcontent, new tab3(), tabId);
        }
        else
        {
            updateTab(android.R.id.tabcontent, new tab4(), tabId);
        }
    }

    public void updateTab(int placeholder, Fragment fragment, String tabId)
    {
        getSupportFragmentManager().beginTransaction()
                .replace(placeholder, fragment, tabId)
                .commit();
    }
}

activity_tabhost.xml:

  <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:orientation="vertical" >


            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1" >

                <FrameLayout
                    android:id="@+id/tab_1"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />

                <FrameLayout
                    android:id="@+id/tab_2"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />

                <FrameLayout
                    android:id="@+id/tab_3"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />

                <FrameLayout
                    android:id="@+id/tab_4"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />

            </FrameLayout >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

        </LinearLayout >

    </TabHost >

tab1.xml,tab2.xml,tab3.xml,tab4.xml:

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

</LinearLayout>

tab1.java,tab2.java,tab3.java,tab4.java:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class tab1 extends Fragment
{
    private static final String TAG = "tab1";

    @Override
    public void onActivityCreated(final Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        Log.i(TAG, "onActivityCreated");
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState)
    {
        Log.i(TAG, "onCreateView");

        return inflater.inflate(R.layout.tab1, container, false);
    }
}

的AndroidManifest.xml:

<activity android:name="<YOUR_PACKAGE_NAME>.TabHostActivity" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

</activity>

使用API​​的v19作为目标,使用android.support.v4.app库至少使用v10。

再一次,谢谢你让我到达这一点,我花了10个小时尝试,我发现的一切都已经过时了。希望这可以帮助处于我前身状态的其他人。您现在应该具有工作状态,并且可以看到您可以在哪里设计选项卡以及放置片段内容的位置。

PS - 是的,在我的泛化传递中,它确实导致了xml内容,并且选项卡被称为“tab1.whatever”,希望这不会太混乱,这可以用一点上下文推断出来。