0

Android プロジェクトで SWIPE タブを使用してアプリケーションバーを実装しようとしています。2 つのタブ (tab1 と tab2) があるとします。そして、これらのタブにさまざまなコンテンツを表示したいと考えています。(実際には、これ以上何もしたくないのです)。

Tab1 にはリストが含まれ、Tab2 には「別の」リストといくつかのテキストが含まれます。2 つのタブに 2 つの「アクティビティ」を使用することはできますか? (それは私が今していることです)

カスタム アダプターを使用して、リストのコンテンツを設定します。

 final ListView lv = (ListView)findViewById(R.id.tab1_list);
 lv.setAdapter(new CustomListAdapter(this, tab1Items));

しかし、タブのコンテンツを正しく表示できません。まったく表示されないか、同じコンテンツが表示されます。

タブとリストを含む(アダプターを使用している)アプリバーを使用する方法、またはいくつかの小さなコード例について、誰かが私に良いアイデアを持っていますか?

どんな助けにもとても感謝しています。

4

2 に答える 2

2

「スワイプタブ」が必要な例を次に示します。

<?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        <TabHost
            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:orientation="horizontal"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="0"
                    />

                <FrameLayout
                    android:id="@android:id/tabcontent"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="0"/>

                <android.support.v4.view.ViewPager
                    android:id="@+id/viewpager"
                    android:layout_width="fill_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    />
            </LinearLayout>
        </TabHost>
    </LinearLayout>

PagerAdapter を定義します。

package com.andy.fragments.viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;


public class PagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }


    @Override
    public int getCount() {
        return this.fragments.size();
    }
}

タブ FragmentActivity を定義します。

package com.andy.fragments.tabs;

import java.util.HashMap;
import java.util.List;
import java.util.Vector;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.TabHost;
import android.widget.TabHost.TabContentFactory;

import com.andy.R;
import com.andy.fragments.viewpager.PagerAdapter;


public class TabsViewPagerFragmentActivity extends FragmentActivity implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {

    private TabHost mTabHost;
    private ViewPager mViewPager;
    private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabsViewPagerFragmentActivity.TabInfo>();
    private PagerAdapter mPagerAdapter;

    private class TabInfo {
         private String tag;
         private Class<?> clss;
         private Bundle args;
         private Fragment fragment;
         TabInfo(String tag, Class<?> clazz, Bundle args) {
             this.tag = tag;
             this.clss = clazz;
             this.args = args;
         }

    }

    class TabFactory implements TabContentFactory {

        private final Context mContext;

        public TabFactory(Context context) {
            mContext = context;
        }


        public View createTabContent(String tag) {
            View v = new View(mContext);
            v.setMinimumWidth(0);
            v.setMinimumHeight(0);
            return v;
        }

    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.tabs_viewpager_layout);

        this.initialiseTabHost(savedInstanceState);
        if (savedInstanceState != null) {
            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
        }

        this.intialiseViewPager();
    }


    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("tab", mTabHost.getCurrentTabTag()); 
        super.onSaveInstanceState(outState);
    }


    private void intialiseViewPager() {

        List<Fragment> fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName()));
        fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName()));
        fragments.add(Fragment.instantiate(this, Tab3Fragment.class.getName()));
        this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(), fragments);

        this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);
        this.mViewPager.setAdapter(this.mPagerAdapter);
        this.mViewPager.setOnPageChangeListener(this);
    }


    private void initialiseTabHost(Bundle args) {
        mTabHost = (TabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup();
        TabInfo tabInfo = null;
        TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab1").setIndicator("Tab 1"), ( tabInfo = new TabInfo("Tab1", Tab1Fragment.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);
        TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab2").setIndicator("Tab 2"), ( tabInfo = new TabInfo("Tab2", Tab2Fragment.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);
        TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab3").setIndicator("Tab 3"), ( tabInfo = new TabInfo("Tab3", Tab3Fragment.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);

        mTabHost.setOnTabChangedListener(this);
    }


    private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {

        tabSpec.setContent(activity.new TabFactory(activity));
        tabHost.addTab(tabSpec);
    }


    public void onTabChanged(String tag) {

        int pos = this.mTabHost.getCurrentTab();
        this.mViewPager.setCurrentItem(pos);
    }


    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {


    }


    @Override
    public void onPageSelected(int position) {

        this.mTabHost.setCurrentTab(position);
    }


    @Override
    public void onPageScrollStateChanged(int state) {


    }
}
于 2012-11-21T12:30:07.520 に答える
1

レイアウトアプローチを使用しないのはなぜですか? 次のようにタブ ホストを配置するレイアウトを作成します。

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

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android1:id="@android:id/tabhost"
android1:layout_width="match_parent"
android1:layout_height="match_parent" >

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

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

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

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

    <LinearLayout
        android1:id="@+id/tab3"
        android1:layout_width="match_parent"
        android1:layout_height="match_parent" >
    </LinearLayout>
</FrameLayout>

したがって、id tab1の LinearLayout では、最初のリスト (など) を追加できます。

于 2012-11-21T12:11:17.510 に答える