Catatan : Pada saat posting ini, tidak ada cara untuk menerapkan MapView sebagai fragmen, yang mungkin menempatkan spanner dalam bekerja jika Anda berpikir tentang menggunakan pola ini UI dengan MapView.
Untuk menerapkan Tabs & ViewPager, menggunakan fragmen pada perangkat yang menjalankan Android 2.1 atau lebih tinggi, Anda akan perlu menyertakan Kompatibilitas Android perpustakaan. Dalam contoh saya, saya menggunakan library Kompatibilitas v4.
Step-By-Step
- Define the Tab ViewPager layout
- Define the PagerAdapter
- Define the Tab FragmentActivity.
Tata letak ViewPager Tab
Tab ViewPager tata letak (tabs_viewpager_layout.xml) mendeklarasikan TabHost dan pemandangan TabWidget anak seperti biasa. Untuk implementasi ini, alih-alih memiliki FrameLayout dummy untuk menahan konten, kita mendefinisikan ViewPager (android.support.v4.view.ViewPager)
Define the PagerAdapter<?xmlversion="1.0"encoding="utf-8"?>android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TabHostandroid:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TabWidgetandroid:id="@android:id/tabs"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0"/><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="0dp"android:layout_height="0dp"android:layout_weight="0"/><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout></TabHost></LinearLayout>
As explained in the previous post, Page Swiping using ViewPager , the PagerAdapter is responsible for creating/returning the appropriate Fragment to the ViewPager. The declaration of PageAdapter is unchanged from the previous post.
packagecom.andy.fragments.viewpager;importjava.util.List;importandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentManager;importandroid.support.v4.app.FragmentPagerAdapter;/*** The <code>PagerAdapter</code> serves the fragments when paging.* @author mwho*/publicclassPagerAdapterextendsFragmentPagerAdapter {privateList<Fragment> fragments;/*** @param fm* @param fragments*/publicPagerAdapter(FragmentManager fm, List<Fragment> fragments) {super(fm);this.fragments = fragments;}/* (non-Javadoc)* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)*/@Overridepublic Fragment getItem(int position) {return this.fragments.get(position);}/* (non-Javadoc)* @see android.support.v4.view.PagerAdapter#getCount()*/@OverridepublicintgetCount() {returnthis.fragments.size();}}
Define the Tab FragmentActivity
The Tab FragmentActivity is a modified version Tab FragmentActivity I posted about in, Tabs, The Fragment Way . Thankfully, using ViewPager requires less code =)*Disclaimer: The redundant lines of code are there to illustrate the minimal amount of changes required to implement view paging from the stock Tab implementation*
Change 1 : As per the normal initialisation of Tabs, we create Tahhost.TabSpec instances for each tab. In this implementation, we simple just add it to the TabHost (line 139) without having to detach fragments.
Change 2 : Initialise the ViewPager . From line 099, we instantiate the Fragments and pass them to the ViewPager via the PagerAdapter . The order that the Fragments are supplied in the List will determine their tab order.
Change 3 : Tab FragmentActivity to implement ViewPager.OnPageChangeListener interface . In order to handle page “swipe” events, our Tab FragmentActivity needs to implement the ViewPager.OnPageChangeListener interface. For our purpose we only really need to implement the onPageSelect() method (Line 168). Simply, when the page is selected (paged), it’s associated Tab is selected.
Change 4 : Modify the onTabChanged() method. Similarly to Change 3 , when a tab is select (and therefore becomes selected), we set the appropriate Fragment via the ViewPager mViewPager (Line 148).
Sumber @ thepseudocoder dot wordpress dot compackagecom.andy.fragments.tabs;importjava.util.HashMap;importjava.util.List;importjava.util.Vector;importandroid.content.Context;importandroid.os.Bundle;importandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentActivity;importandroid.support.v4.view.ViewPager;importandroid.view.View;importandroid.widget.TabHost;importandroid.widget.TabHost.TabContentFactory;importcom.andy.R;importcom.andy.fragments.viewpager.PagerAdapter;/*** The <code>TabsViewPagerFragmentActivity</code> class implements the Fragment activity that maintains a TabHost using a ViewPager.* @author mwho*/publicclassTabsViewPagerFragmentActivityextendsFragmentActivityimplementsTabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {privateTabHost mTabHost;privateViewPager mViewPager;privateHashMap<String, TabInfo> mapTabInfo =newHashMap<String, TabsViewPagerFragmentActivity.TabInfo>();privatePagerAdapter mPagerAdapter;/**** @author mwho* Maintains extrinsic info of a tab's construct*/privateclassTabInfo {privateString tag;privateClass<?> clss;privateBundle args;privateFragment fragment;TabInfo(String tag, Class<?> clazz, Bundle args) {this.tag = tag;this.clss = clazz;this.args = args;}}/*** A simple factory that returns dummy views to the Tabhost* @author mwho*/classTabFactoryimplementsTabContentFactory {privatefinalContext mContext;/*** @param context*/publicTabFactory(Context context) {mContext = context;}/** (non-Javadoc)* @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)*/publicView createTabContent(String tag) {View v =newView(mContext);v.setMinimumWidth(0);v.setMinimumHeight(0);returnv;}}/** (non-Javadoc)* @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)*/protectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Inflate the layoutsetContentView(R.layout.tabs_viewpager_layout);// Initialise the TabHostthis.initialiseTabHost(savedInstanceState);if(savedInstanceState !=null) {mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));//set the tab as per the saved state}// Intialise ViewPagerthis.intialiseViewPager();}/** (non-Javadoc)* @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)*/protectedvoidonSaveInstanceState(Bundle outState) {outState.putString("tab", mTabHost.getCurrentTabTag());//save the tab selectedsuper.onSaveInstanceState(outState);}/*** Initialise ViewPager*/privatevoidintialiseViewPager() {List<Fragment> fragments =newVector<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 =newPagerAdapter(super.getSupportFragmentManager(), fragments);//this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);this.mViewPager.setAdapter(this.mPagerAdapter);this.mViewPager.setOnPageChangeListener(this);}/*** Initialise the Tab Host*/privatevoidinitialiseTabHost(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 =newTabInfo("Tab1", Tab1Fragment.class, args)));this.mapTabInfo.put(tabInfo.tag, tabInfo);TabsViewPagerFragmentActivity.AddTab(this,this.mTabHost,this.mTabHost.newTabSpec("Tab2").setIndicator("Tab 2"), ( tabInfo =newTabInfo("Tab2", Tab2Fragment.class, args)));this.mapTabInfo.put(tabInfo.tag, tabInfo);TabsViewPagerFragmentActivity.AddTab(this,this.mTabHost,this.mTabHost.newTabSpec("Tab3").setIndicator("Tab 3"), ( tabInfo =newTabInfo("Tab3", Tab3Fragment.class, args)));this.mapTabInfo.put(tabInfo.tag, tabInfo);// Default to first tab//this.onTabChanged("Tab1");//mTabHost.setOnTabChangedListener(this);}/*** Add Tab content to the Tabhost* @param activity* @param tabHost* @param tabSpec* @param clss* @param args*/privatestaticvoidAddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {// Attach a Tab view factory to the spectabSpec.setContent(activity.newTabFactory(activity));tabHost.addTab(tabSpec);}/** (non-Javadoc)* @see android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String)*/publicvoidonTabChanged(String tag) {//TabInfo newTab = this.mapTabInfo.get(tag);intpos =this.mTabHost.getCurrentTab();this.mViewPager.setCurrentItem(pos);}/* (non-Javadoc)* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled(int, float, int)*/@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {// TODO Auto-generated method stub}/* (non-Javadoc)* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected(int)*/@Overridepublic void onPageSelected(int position) {// TODO Auto-generated method stubthis.mTabHost.setCurrentTab(position);}/* (non-Javadoc)* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrollStateChanged(int)*/@OverridepublicvoidonPageScrollStateChanged(intstate) {// TODO Auto-generated method stub}}

0 Response to " Android : Tabs + ViewPager "Swipe-able Tabs, FTW" "
Posting Komentar