Android App在ViewPager中使用Fragment的實(shí)例講解
據(jù)說Android最推薦的是在ViewPager中使用FragMent,即ViewPager中的頁面不像前面那樣用LayoutInflater直接從布局文件加載,而是一個個Fragment。注意這里的Fragment
是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment。
使用v4包里的Fragment的Activity必須繼承自FragmentActivity。
其實(shí)使用Fragment與前面不使用Fragment非常類似:
第一步 在主布局文件里放一個ViewPager組件
第二步 為每個頁面建立布局文件,把界面寫好
第三步 為每個頁面新建Fragment類,并加載布局文件中的界面
第四部 為ViewPager設(shè)定Adapter,只不過這里的Adapter不是PagerAdapter,而是換成
FragmentPagerAdapter,實(shí)現(xiàn)兩個方法:
getCount():返回頁面數(shù)目
getItem(position):返回position位置的Fragment。
下面來看一個ViewPager與Fragment實(shí)現(xiàn)頁面滑動效果的例子:
首先繼承FragmentActivity,
為ViewPager提供展示所需的Fragment和FragmentPagerAdapter:
Fragment來指定頁面的布局以及功能
// fragment private class MyFragment extends Fragment { private String text; private int color; public MyFragment(String text, int color) { this.text = text; this.color = color; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { TextView tv = new TextView(MainActivity.this); tv.setBackgroundColor(color); tv.setText(text); return tv; } }
adapter指定該Viewpager有多少頁面以及那個位置需要顯示哪個頁面:
// adapter private class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return pages.size(); } @Override public Fragment getItem(int arg0) { return pages.get(arg0); } }
設(shè)置OnPageChangeListener,指定頁面改變時需要做什么其他操作:
@Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams(); lp.leftMargin = (int) ((arg0 + arg1) * mTabLineWidth); tabline.setLayoutParams(lp); } @Override public void onPageSelected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setSelected(true); } else { titles.get(i).setSelected(false); } } }
完整的代碼:
package com.hzy.myviewpager; import java.util.ArrayList; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.DisplayMetrics; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.TextView; import com.hzy.myviewpager.R.id; public class MainActivity extends FragmentActivity implements OnPageChangeListener, OnClickListener { ViewPager pager = null; View tabline = null; private int mTabLineWidth; // titles TextView title1 = null; TextView title2 = null; TextView title3 = null; ArrayList<TextView> titles = null; ArrayList<Fragment> pages = null; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); initView(); initTabline(); } private void initView() { setContentView(R.layout.activity_main); pages = new ArrayList<Fragment>(); titles = new ArrayList<TextView>(); pager = (ViewPager) findViewById(id.main_viewpager); title1 = (TextView) findViewById(id.main_tab1); title2 = (TextView) findViewById(id.main_tab2); title3 = (TextView) findViewById(id.main_tab3); title1.setOnClickListener(this); title2.setOnClickListener(this); title3.setOnClickListener(this); titles.add(title1); titles.add(title2); titles.add(title3); // create new fragments pages.add(new MyFragment("tab1", Color.BLUE)); pages.add(new MyFragment("tab2", Color.RED)); pages.add(new MyFragment("tab3", Color.CYAN)); // set adapter pager.setAdapter(new MyAdapter(getSupportFragmentManager())); pager.setOnPageChangeListener(this); pager.setCurrentItem(0); titles.get(0).setSelected(true); } // tablines private void initTabline() { tabline = findViewById(id.main_tab_line); Display display = getWindow().getWindowManager().getDefaultDisplay(); DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); mTabLineWidth = outMetrics.widthPixels / 3; LayoutParams lp = tabline.getLayoutParams(); lp.width = mTabLineWidth; tabline.setLayoutParams(lp); } @Override public void onClick(View v) { switch (v.getId()) { case id.main_tab1: pager.setCurrentItem(0, true); break; case id.main_tab2: pager.setCurrentItem(1, true); break; case id.main_tab3: pager.setCurrentItem(2, true); break; default: break; } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams(); lp.leftMargin = (int) ((arg0 + arg1) * mTabLineWidth); tabline.setLayoutParams(lp); } @Override public void onPageSelected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setSelected(true); } else { titles.get(i).setSelected(false); } } } // fragment private class MyFragment extends Fragment { private String text; private int color; public MyFragment(String text, int color) { this.text = text; this.color = color; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { TextView tv = new TextView(MainActivity.this); tv.setBackgroundColor(color); tv.setText(text); return tv; } } // adapter private class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return pages.size(); } @Override public Fragment getItem(int arg0) { return pages.get(arg0); } } }
代碼中通過實(shí)現(xiàn)OnPageChangeListener接口手動設(shè)置了頁面指示條的位置。
- android 中viewpager+fragment仿微信底部TAG完美漸變
- Android 開發(fā)之BottomBar+ViewPager+Fragment實(shí)現(xiàn)炫酷的底部導(dǎo)航效果
- Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動切換效果
- Android App中ViewPager與Fragment結(jié)合的一些問題解決
- Android中ViewPager獲取當(dāng)前顯示的Fragment
- Android基于ViewPager Fragment實(shí)現(xiàn)選項(xiàng)卡
- Android中ViewPager實(shí)現(xiàn)滑動指示條及與Fragment的配合
- Android實(shí)現(xiàn)Tab布局的4種方式(Fragment+TabPageIndicator+ViewPager)
- Android中ViewPager和Fragment的使用
- Android仿微信Viewpager-Fragment惰性加載(lazy-loading)
相關(guān)文章
淺談Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解
本篇文章小編為大家介紹,Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解。需要的朋友參考下2013-04-04基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題
這篇文章主要介紹了基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu
這篇文章主要為大家詳細(xì)介紹了Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07Android圖片翻轉(zhuǎn)動畫簡易實(shí)現(xiàn)代碼
Android圖片翻轉(zhuǎn)動畫效果如何實(shí)現(xiàn),本文將給你一個驚喜,實(shí)現(xiàn)代碼已經(jīng)列出,需要的朋友可以參考下2012-11-11Android頂部狀態(tài)欄透明化并釋放空間的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Android頂部狀態(tài)欄透明化并釋放空間的兩種實(shí)現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03Android使用自定義View實(shí)現(xiàn)橫行時間軸效果
這篇文章主要給大家介紹了關(guān)于Android使用自定義View實(shí)現(xiàn)橫行時間軸效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Android學(xué)習(xí)筆記之ActionBar Item用法分析
這篇文章主要介紹了Android學(xué)習(xí)筆記之ActionBar Item用法,結(jié)合實(shí)例形式分析了ActionBar Item的具體功能與相關(guān)使用技巧,需要的朋友可以參考下2017-05-05