ViewPagerInFragment 在Fragment中使用ViewPager
来源:互联网 发布:oracle手动创建数据库 编辑:程序博客网 时间:2024/06/10 05:01
平时,我们都是在Activity中使用ViewPager,其实我们在Fragment中使用Fragment.
这是整个工程下的Java文件,其中SingleFragmentActivity是通用类,MainFragment就是包含ViewPager的Fragment;WeixinFragment、FriendFragment、AdrressFragment、SettingFragment就是ViewPager可以滑动的四个Fragment.除了SingelFragmentActivity外,其他的Fragment对已一个布局文件。
WeixinFragment、FriendFragment、AdrressFragment、SettingFragment四个Fragment分别加载对于的布局文件。
布局文件activity_fragment.xml只是一个通用的布局文件,由SingleFragmentActivity加载。
activity_fragment.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragmentContainer" android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout>
SingleFragmentActivity.java
public abstract class SingleFragmentActivity extends FragmentActivity { protected abstract Fragment createFragment(); protected int getLayoutResId(){ return R.layout.activity_fragment; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutResId()); FragmentManager fragmentManager = getSupportFragmentManager(); Fragment fragment = fragmentManager.findFragmentById(R.id.fragmentContainer); if (fragment == null){ fragment = createFragment(); fragmentManager.beginTransaction() .add(R.id.fragmentContainer, fragment) .commit(); } }}
fragment_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/fragment_top"/> <android.support.v4.view.ViewPager android:id="@+id/fragment_main_viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:focusable="false"> </android.support.v4.view.ViewPager> <include layout="@layout/fragment_bottom"/></LinearLayout>
底部布局文件fragment_bottom.xml由四个ImageView组成,它们正常的时候使用灰色图标,在被点击的时候,图标使用绿色的按下图标。
fragment_bottom.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/weixin" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="center"> <ImageView android:id="@+id/weixin_imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/tab_weixin_normal"/> </LinearLayout> <LinearLayout android:id="@+id/address" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="center"> <ImageView android:id="@+id/address_imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/tab_address_normal"/> </LinearLayout> <LinearLayout android:id="@+id/find_friend" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="center"> <ImageView android:id="@+id/find_friend_imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/tab_find_frd_normal"/> </LinearLayout> <LinearLayout android:id="@+id/setting" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="center"> <ImageView android:id="@+id/setting_imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/tab_settings_normal"/> </LinearLayout></LinearLayout>
在MainFragment中加载fragment_main.xml布局文件,并初始化四个Fragment,以及ViewPager
@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_main, container, false); // 初始化MainFragment initFragment(); // 初始化ViewPager initViewPager(); return mView; }
在initFragment( )方法中,找到ViewPager的id;四个包裹图片的LinearLayout的id,主要用于点击底部的图片时,切换对应的Fragment;四个ImagaView的id,主要用于切换Fragment时,改变图标的状态。
在initViewPager( )方法中,使用ArragList装载四个Fragment, 自定义适配器adapter并设置成ViewPager的是适配器。通过对ViewPager滑动状态的监听,设置不同的Fragment以及底部图标不同的状态。
private void initFragment() { mViewPager = (ViewPager) mView.findViewById(R.id.fragment_main_viewPager); // 四个LinearLayout mWeixin = (LinearLayout) mView.findViewById(R.id.weixin); mAddress = (LinearLayout) mView.findViewById(R.id.address); mFriend = (LinearLayout) mView.findViewById(R.id.find_friend); mSetting = (LinearLayout) mView.findViewById(R.id.setting); // 四个ImageView mWeixinImageView = (ImageView) mView.findViewById(R.id.weixin_imageView); mAddressImageView = (ImageView) mView.findViewById(R.id.address_imageView); mFrindImageView = (ImageView) mView.findViewById(R.id.find_friend_imageView); mSettingImageView = (ImageView) mView.findViewById(R.id.setting_imageView); mWeixin.setOnClickListener(this); mAddress.setOnClickListener(this); mFriend.setOnClickListener(this); mSetting.setOnClickListener(this); } private void initViewPager(){ mWeixinFragment = new WeixinFragment(); mAddressFragment = new AddressFragment(); mFriendFragment = new FriendFragment(); mSettingFragment = new SettingFragment(); mArrayList = new ArrayList<Fragment>(); mArrayList.add(mWeixinFragment); mArrayList.add(mAddressFragment); mArrayList.add(mFriendFragment); mArrayList.add(mSettingFragment); FragmentManager fm = getActivity().getSupportFragmentManager(); mAdapter = new MyFragmentAdapter(fm, mArrayList); mViewPager.setAdapter(mAdapter); // 第一次进入应用界面时,设置底部的Weixin图片 setTextViewState(0); // 对ViewPager滑动时进行监听 mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { int currentItm = mViewPager.getCurrentItem(); setTextViewState(currentItm); } @Override public void onPageScrollStateChanged(int state) { } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.weixin: setSelect(0); break; case R.id.address: setSelect(1); break; case R.id.find_friend: setSelect(2); break; case R.id.setting: setSelect(3); break; } } private void setSelect(int i) { mViewPager.setCurrentItem(i); // 设置Fragment mAdapter.getItem(i); // 设置底部的图片 setTextViewState(i); } // 选择底部的其中一个图片时,其他三个图片设为暗色 private void setTextViewState(int currentItm) { // 获取资源 Resources r = getResources(); switch (currentItm){ case 0: mWeixinImageView.setImageDrawable(r.getDrawable(R.drawable.tab_weixin_pressed)); mAddressImageView.setImageDrawable(r.getDrawable(R.drawable.tab_address_normal)); mFrindImageView.setImageDrawable(r.getDrawable(R.drawable.tab_find_frd_normal)); mSettingImageView.setImageDrawable(r.getDrawable(R.drawable.tab_settings_normal)); break; case 1: mWeixinImageView.setImageDrawable(r.getDrawable(R.drawable.tab_weixin_normal)); mAddressImageView.setImageDrawable(r.getDrawable(R.drawable.tab_address_pressed)); mFrindImageView.setImageDrawable(r.getDrawable(R.drawable.tab_find_frd_normal)); mSettingImageView.setImageDrawable(r.getDrawable(R.drawable.tab_settings_normal)); break; case 2: mWeixinImageView.setImageDrawable(r.getDrawable(R.drawable.tab_weixin_normal)); mAddressImageView.setImageDrawable(r.getDrawable(R.drawable.tab_address_normal)); mFrindImageView.setImageDrawable(r.getDrawable(R.drawable.tab_find_frd_pressed)); mSettingImageView.setImageDrawable(r.getDrawable(R.drawable.tab_settings_normal)); break; case 3: mWeixinImageView.setImageDrawable(r.getDrawable(R.drawable.tab_weixin_normal)); mAddressImageView.setImageDrawable(r.getDrawable(R.drawable.tab_address_normal)); mFrindImageView.setImageDrawable(r.getDrawable(R.drawable.tab_find_frd_normal)); mSettingImageView.setImageDrawable(r.getDrawable(R.drawable.tab_settings_pressed)); break; default: break; } }
通过继承FragmentPagerAdapter,自定义自己的适配器。构造函数传入的参数分别为Fragment,ArrayList,这样保证适配器的通用性,下次我们可以将这个适配器在其他项目中使用。
MyFragmentAdapter.java
public class MyFragmentAdapter extends FragmentPagerAdapter { private static final String TAG = "MyFragmentAdapter"; private ArrayList<Fragment> mFragmentList; public MyFragmentAdapter(FragmentManager fm, ArrayList<Fragment> list){ super(fm); mFragmentList = list; } @Override public int getCount() { Log.i(TAG, "mFragmentList.size() " + mFragmentList.size()); return mFragmentList.size(); } @Override public Fragment getItem(int position) { Log.i(TAG, "position: " + position); return mFragmentList.get(position); }}
这是最后我们完成的结果,代码我已经上传到GitHub上,可自行下载https://github.com/yxhuangCH/viewpagerinfragment
- ViewPagerInFragment 在Fragment中使用ViewPager
- 在ViewPager中使用Fragment嵌套问题
- 在Fragment中使用viewPager嵌套Fragment遇到的问题(双侧viewpager)
- 在Fragment中切换ViewPager
- 在Fragment中切换ViewPager
- 在ViewPager中获取Fragment
- Fragment在Viewpager中重用
- 在ViewPager中使用Fragment实现界面左右滑动
- Android 在 ViewPager 中使用 Fragment 的懒加载
- 在fragment中使用viewpager+fragment时,fragment页面消失的问题
- ViewPager中使用fragment用法
- 在fragment中使用ViewPager:java.lang.IllegalStateException: Observer android.support.v4.view.ViewPager$
- 在菜单中Fragment中嵌套viewpager
- 关于在Fragment中使用多组ViewPager+TabLayout出现的部分Fragment不显示问题
- Fragment在ViewPager中布局文件丢失
- 在Viewpager中的Fragment使用ContextMenu问题
- 在Viewpager中的Fragment使用ContextMenu问题
- Android中ViewPager+Fragment的基本使用
- JVM调优方法总结
- Git学习笔记(一) Git的安装与使用
- http响应状态码大全
- sicily 1077(动态规划)
- BZOJ2754【AC自动机】
- ViewPagerInFragment 在Fragment中使用ViewPager
- TCP建立,释放连接
- Git学习笔记(二) Git初始化
- 九度oj-1152-点菜问题
- 36. PHP 逻辑运算符
- Git学习笔记(三) Git暂存区
- Java基础---对String s1="abc"和String s2=new String("abc")的理解
- web开发的常用工具
- c++运算符重载总结