使用FragmentTabHost和ViewPager實現仿主介面側滑,viewpagertabhost
最近看到很多介面首頁都差不多,決定研究研究寫出來,以後直接拿來用,不做代碼的輪子,多總結,多學習
還是廢話少說,先
介紹一下My Code:
首先是布局檔案:
<?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" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:color/black" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> </android.support.v4.app.FragmentTabHost></LinearLayout>
當然如果你想讓底部的tab放在上面的話,可以把viewPager和FragmentTabHost位置換一下,以上就是主介面了,比較簡單沒什麼好說的,給個小技巧吧,shift+ctrl+T可以尋找你想要的包,例如輸入viewPager,直接粘android.support.v4.view.ViewPager就可以了,比較方便
下面就是MainActivity了:
package com.sdufe.thea.framework;import java.util.ArrayList;import java.util.List;import java.util.zip.Inflater;import android.os.Bundle;import android.R.integer;import android.annotation.SuppressLint;import android.app.Activity;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.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TabHost.OnTabChangeListener;import android.widget.TabHost.TabSpec;import android.widget.TabWidget;import android.widget.TextView;public class MainActivity extends FragmentActivity implementsOnPageChangeListener, OnTabChangeListener {private FragmentTabHost mTabHost;private LayoutInflater layoutInflater;private Class fragmentArray[] = { Fragment1.class, Fragment.class,Fragment3.class, Fragment4.class };private int imageViewArray[] = { R.drawable.mywork, R.drawable.mypatient,R.drawable.infusion, R.drawable.personal };private String textViewArray[] = { "工作", "病人", "互動", "個人中心" };private List<Fragment> list = new ArrayList<Fragment>();private ViewPager vp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_tab_layout);initView();initPage();}/** * 控制項初始化 */private void initView() {vp = (ViewPager) findViewById(R.id.pager);vp.setOnPageChangeListener(this);layoutInflater = LayoutInflater.from(this);mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);mTabHost.setup(this, getSupportFragmentManager(), R.id.pager);mTabHost.setOnTabChangedListener(this);int count = textViewArray.length;for (int i = 0; i < count; i++) {TabSpec tabSpec = mTabHost.newTabSpec(textViewArray[i]).setIndicator(getTabItemView(i));mTabHost.addTab(tabSpec, fragmentArray[i], null);mTabHost.setTag(i);}}/** * 初始化Fragment */private void initPage() {Fragment1 fragment1 = new Fragment1();Fragment2 fragment2 = new Fragment2();Fragment3 fragment3 = new Fragment3();Fragment4 fragment4 = new Fragment4();list.add(fragment1);list.add(fragment2);list.add(fragment3);list.add(fragment4);vp.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), list));}private View getTabItemView(int i) {View view = layoutInflater.inflate(R.layout.tab_content, null);ImageView mImageView = (ImageView) view.findViewById(R.id.tab_imageview);TextView mTextView = (TextView) view.findViewById(R.id.tab_textview);mImageView.setBackgroundResource(imageViewArray[i]);mTextView.setText(textViewArray[i]);return view;}@Overridepublic 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;}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {TabWidget widget = mTabHost.getTabWidget();int oldFocusability = widget.getDescendantFocusability();widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);mTabHost.setCurrentTab(arg0);widget.setDescendantFocusability(oldFocusability);mTabHost.getTabWidget().getChildAt(arg0) .setBackgroundResource(R.drawable.selector_tab_background);}@Overridepublic void onTabChanged(String tabId) {int position = mTabHost.getCurrentTab();vp.setCurrentItem(position);}}
代碼相對來說比較簡單,下面的就不貼了
源碼:https://github.com/zimoguo/FragmentTabHost-ViewPager
對於android中的fragment與viewpager的結合使用
如果只是用viewpager,每次都要重新載入頁面,速度比較慢(內容少的時候可能看不出來,比如一張圖片), 而fragment載入過一次後會快取資料,第二次划過來的時候感覺平順些,不過這也是建立在消耗記憶體的基礎上的,就是以空間換取時間,像listview的viewholer最佳化技術一樣。另外fragment在導航條方面還是比單獨的viewpager有優勢的。所以fragment和viewpager結合使用可以說是相得益彰,只是記憶體消耗多點,代碼也複雜多了。
Fragment裡面用viewPager嵌入三個subFragment,怎在Fragment切換
資料一直在儲存中,adapter我是在onAttach事件中建立的。但介面上的view都會重建一次。我的onresume和onStart中沒有資料操作方法。是空的。我是在onViewCreated事件中載入或重新恢複到view上的。