椎锋陷陈 2014-06-02
1. FragmentTabHost的基本使用方法,请参照官方教程和案例
http://developer.android.com/intl/ja/reference/android/support/v4/app/FragmentTabHost.html
2. 首先,我们定义页面的布局文件
activity_bottom.xml
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <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/itemViewPager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" /> </LinearLayout> </android.support.v4.app.FragmentTabHost>
把ViewPager和TabWidget放在FragmentTabHost里面
ViewPager用来显示页面内容,TabWidget用来显示按钮。如何把ViewPager和TabWidget调换位置的化,按钮将出现在页面的上方。
FragmentLayout用来识别当前选中的Tab。
3. 接下来在drawable文件夹下定义每个按钮的selector,用于切换页面或者点击按钮时,使按钮图片改变。
tab1_button.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/tab1_selected" android:state_enabled="false"/> <item android:drawable="@drawable/tab1_normal" android:state_enabled="true"/> </selector>
tab2, tab3, tab4....都采用同样的定义。
4. 定义各页面的Fragment的布局。
fragment1.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" > </TextView> </FrameLayout>
fragment2,3,4...采用类似定义。
5. 各Tab的表示内容
tab1.xml
<?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/description" android:scaleType="centerInside" android:src="@drawable/tab1_button" />
tab2,3,4...采用类似定义
6.接下来实装Activity
继承与FragmentActivity
MainActivity
package org.kaka.booker.activity; import java.util.ArrayList; import java.util.List; import org.kaka.booker.R; import org.kaka.booker.activity.fragment.Fragment1; import org.kaka.booker.activity.fragment.Fragment2; import org.kaka.booker.activity.fragment.Fragment3; import org.kaka.booker.activity.fragment.Fragment4; import org.kaka.booker.adapter.FragmentViewPagerAdapter; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTabHost; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.widget.TabHost.OnTabChangeListener; public class MainActivity extends FragmentActivity { private FragmentTabHost tabHost; private String currentTabId; private View currentView; private ViewPager viewPager; private List<Fragment> fragmentList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bottom); initTabHost(); initViewPager(); } private void initTabHost() { fragmentList = new ArrayList<Fragment>(); tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); LayoutInflater inflate = LayoutInflater.from(this); View tab1 = inflate.inflate(R.layout.tab1, null); View tab2 = inflate.inflate(R.layout.tab2, null); View tab3 = inflate.inflate(R.layout.tab2, null); View tab4 = inflate.inflate(R.layout.tab2, null); tab1.setEnabled(false); tab2.setEnabled(true); tab3.setEnabled(true); tab4.setEnabled(true); fragmentList.add(new Fragment1()); fragmentList.add(new Fragment2()); fragmentList.add(new Fragment3()); fragmentList.add(new Fragment4()); tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator(tab1), Fragment1.class, null); tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator(tab2), Fragment2.class, null); tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator(tab3), Fragment3.class, null); tabHost.addTab(tabHost.newTabSpec("tab4").setIndicator(tab4), Fragment4.class, null); currentTabId = "tab1"; currentView = tab1; tabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { if (!currentTabId.equals(tabId)) { currentView.setEnabled(true); View preView = tabHost.getCurrentTabView(); currentView = preView; preView.setEnabled(false); currentTabId = tabId; } viewPager.setCurrentItem(tabHost.getCurrentTab()); } }); } private void initViewPager() { viewPager = (ViewPager) findViewById(R.id.itemViewPager); viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int arg0) { tabHost.setCurrentTab(arg0); } }); viewPager.setAdapter(new FragmentViewPagerAdapter( getSupportFragmentManager(), fragmentList)); } }
7. 定义ViewPager的适配器
FragmentViewPagerAdapter
package org.kaka.booker.adapter; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class FragmentViewPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; public FragmentViewPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) { super(fm); this.fragmentList = fragmentList; } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return fragmentList.get(arg0); } @Override public int getCount() { // TODO Auto-generated method stub return fragmentList.size(); } }
8. 最后定义每一个页面的Fragment
Fragment1
package org.kaka.booker.activity.fragment; import org.kaka.booker.R; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle bundle) { View view = inflator.inflate(R.layout.fragment_empty, container, false); TextView text = (TextView) view.findViewById(R.id.text1); text.setText("hello"); return view; } }