前久用fragment练习过一个小demo,写完就完事儿了,然后今天看到fragment突然就没有思绪了,所以说明总结与常看是很重要的,今天重新看了遍fragment,来这里做个总结。
Fragment实现底部导航栏
先上效果图:
首先先写布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="example.com.fragmentpractice.MainActivity">
<LinearLayout
android:id="@+id/ll_tab"
android:layout_width="match_parent"
android:layout_height="65dp"
android:orientation="horizontal"
android:layout_margin="5dp"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/tv_book_act"
style="@style/tab_style"
android:drawableTop="@drawable/book"
android:text="阅读"/>
<TextView
android:id="@+id/tv_program_act"
style="@style/tab_style"
android:text="程序"
android:drawableTop="@drawable/program"/>
<TextView
android:id="@+id/tv_me_act"
style="@style/tab_style"
android:text="我"
android:drawableTop="@drawable/me"/>
</LinearLayout>
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/ll_tab"></FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/line"
android:layout_below="@+id/fl_content"/>
</RelativeLayout>
FrameLayout就是显示fragment的一个容器。因为TextView有很多属性相同,所以写在一个style里,style如下:
<style name="tab_style">
<item name="android:textColor">@drawable/text_color</item>
<item name="android:gravity">center</item>
<item name="android:textSize">13sp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:layout_width">0dp</item>
</style>
接着写fragment的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_book"
style="@style/textView"
android:text="book"/>
</LinearLayout>
这里就是简单的显示一个文字,可以根据自己需要的内容去写,另外两个都是一样的,照葫芦画瓢。
Fragment
package example.com.fragmentpractice.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import example.com.fragmentpractice.R;
/**
* Created by csjy on 2017/5/2.
*/
public class BookFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_book,container,false);
return view;
}
}
这里就是简单的将fragment的布局引入
其他两个Fragment也与这个一样。
Fragment只能嵌入在Activity中使用,它有自己的生命周期,但是它的生命周期受Activity的影响。
Activity:
package example.com.fragmentpractice;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import example.com.fragmentpractice.fragment.BookFragment;
import example.com.fragmentpractice.fragment.MeFragment;
import example.com.fragmentpractice.fragment.ProgramFragment;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tvMe,tvBook,tvProgram;
private MeFragment meFragment;
private BookFragment bookFragment;
private ProgramFragment programFragment;
private FrameLayout content;
private FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
manager = getSupportFragmentManager();
tvBook.performClick();
}
private void initListener() {
tvMe.setOnClickListener(this);
tvProgram.setOnClickListener(this);
tvBook.setOnClickListener(this);
}
private void initView() {
tvMe = (TextView) this.findViewById(R.id.tv_me_act);
tvBook = (TextView) this.findViewById(R.id.tv_book_act);
tvProgram = (TextView) this.findViewById(R.id.tv_program_act);
content = (FrameLayout) this.findViewById(R.id.fl_content);
}
private void setSelect(){
tvMe.setSelected(false);
tvBook.setSelected(false);
tvProgram.setSelected(false);
}
private void hideFragment(android.support.v4.app.FragmentTransaction transaction) {
if(meFragment != null) {
transaction.hide(meFragment);
}
if (bookFragment != null){
transaction.hide(bookFragment);
}
if (programFragment != null){
transaction.hide(programFragment);
}
}
@Override
public void onClick(View v) {
android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
hideFragment(transaction);
switch (v.getId()) {
case R.id.tv_me_act:
setSelect();
tvMe.setSelected(true);
if (meFragment == null){
meFragment = new MeFragment();
transaction.add(R.id.fl_content,meFragment);
}else{
transaction.show(meFragment);
}
break;
case R.id.tv_book_act:
setSelect();
tvBook.setSelected(true);
if (bookFragment == null){
bookFragment = new BookFragment();
transaction.add(R.id.fl_content,bookFragment);
}else{
transaction.show(bookFragment);
}
break;
case R.id.tv_program_act:
setSelect();
tvProgram.setSelected(true);
if (programFragment == null){
programFragment = new ProgramFragment();
transaction.add(R.id.fl_content,programFragment);
}else{
transaction.show(programFragment);
}
break;
}
transaction.commit();
}
}
首先说明一点,这里用的Fragment是v4包下的,所以FragmentManager,FragmentTransation都必须相应的导入v4包下的。
有一点值得注意,v4包下实例化FragmentManager时要用getSupportFragmentManager();而app包下实例化FragmentManager是用getFragmentmanager()
接下来对代码进行简单的解析:
首先先想我要实现什么?
- 点击导航栏的任意项会显示相应的Fragment
- 点击导航栏的任意项会显示选中状态(相应的变色)
- 第一次使用要使第一项是选中状态
- fragment不会相互覆盖
明白了要做什么开始实现。
要使第一个TextView在第一次进入时是选中状态,用performClick()方法就可以实现。
首先实例化控件,对几个TextView写点击事件,在点击事件前首先先隐藏所有fragment,不然各个fragment会覆盖。
当点击任意项,首先先将所有的TextView选择状态全设置为false(不这样设置的话就会一直是选中状态),接下来将当项设置为选择状态,对该项对应的fragment进行判空,如果为空就实例化fragment,当将将它添加到显示fragment的容器中(FrameLayout),如果不为空,就将已经加载好的fragment显示出来。
最后注意一定要提交,也就是transaction.commit(),不写这句的话fragment显示不出来。
Fragment+ViewPager实现底部导航栏
先上效果图:
跟上面一样,首先想明白要实现些什么
- 选中相应项改变状态
- 滑动完毕显示相应的fragment
- 点击显示相应的fragment
- 第一项第一次进入是选中状态
布局与上一节的布局类似,只是将显示fragment的容器改为ViewPager
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="example.com.fragmentpractice.MainActivity">
<LinearLayout
android:id="@+id/ll_tab"
android:layout_width="match_parent"
android:layout_height="65dp"
android:orientation="horizontal"
android:layout_margin="5dp"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/tv_book_act"
style="@style/tab_style"
android:drawableTop="@drawable/book"
android:text="阅读"/>
<TextView
android:id="@+id/tv_program_act"
style="@style/tab_style"
android:text="程序"
android:drawableTop="@drawable/program"/>
<TextView
android:id="@+id/tv_me_act"
style="@style/tab_style"
android:text="我"
android:drawableTop="@drawable/me"/>
</LinearLayout>
<!--<FrameLayout-->
<!--android:id="@+id/fl_content"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:layout_above="@+id/ll_tab"></FrameLayout>-->
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/ll_tab"></android.support.v4.view.ViewPager>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/line"
android:layout_below="@+id/view_pager"/>
</RelativeLayout>
fragment的布局不变,fragment不变。
ViewPager使用需要配合适配器
适配器代码如下:
package example.com.fragmentpractice;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import example.com.fragmentpractice.fragment.BookFragment;
import example.com.fragmentpractice.fragment.MeFragment;
import example.com.fragmentpractice.fragment.ProgramFragment;
/**
* Created by csjy on 2017/5/2.
*/
public class MyViewPagerAdapter extends FragmentPagerAdapter {
private MeFragment meFragment;
private BookFragment bookFragment;
private ProgramFragment programFragment;
private static final int PAGER_COUNT = 3;
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position){
case MainActivity.PAGER_ONE:
fragment = bookFragment;
break;
case MainActivity.PAGRT_TWO:
fragment = programFragment;
break;
case MainActivity.PAGER_THREE:
fragment = meFragment;
break;
}
return fragment;
}
@Override
public int getCount() {
return PAGER_COUNT;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
public MyViewPagerAdapter(FragmentManager fm) {
super(fm);
meFragment = new MeFragment();
bookFragment = new BookFragment();
programFragment = new ProgramFragment();
}
}
getCount统计pager的个数。
重点在getItem()方法
首先在Activity中定义三个静态变量,分别表示ViewPager的页数。
在getItem()方法中进行选择,是第一页就把第一页的fragment赋值给fragment,并将fragment返回。
Activity如下:
package example.com.fragmentpractice;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tvMe,tvBook,tvProgram;
// private MeFragment meFragment;
// private BookFragment bookFragment;
// private ProgramFragment programFragment;
// private FrameLayout content;
private ViewPager viewPager;
public static final int PAGER_ONE = 0;
public static final int PAGRT_TWO = 1;
public static final int PAGER_THREE = 2;
// private FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
// manager = getSupportFragmentManager();
// tvBook.performClick();
if(viewPager.getCurrentItem() == 0){
tvBook.setSelected(true);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_book_act:
setSelect();
tvBook.setSelected(true);
viewPager.setCurrentItem(PAGER_ONE);
break;
case R.id.tv_program_act:
setSelect();
tvProgram.setSelected(true);
viewPager.setCurrentItem(PAGRT_TWO);
break;
case R.id.tv_me_act:
setSelect();
tvMe.setSelected(true);
viewPager.setCurrentItem(PAGER_THREE);
break;
}
}
private void initListener() {
tvMe.setOnClickListener(this);
tvProgram.setOnClickListener(this);
tvBook.setOnClickListener(this);
}
private void initView() {
tvMe = (TextView) this.findViewById(R.id.tv_me_act);
tvBook = (TextView) this.findViewById(R.id.tv_book_act);
tvProgram = (TextView) this.findViewById(R.id.tv_program_act);
viewPager = (ViewPager) this.findViewById(R.id.view_pager);
viewPager.setCurrentItem(0);
MyViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
//state = 0 : 表示闲置
//state = 1 :表示正在拖动
//state = 2 :表示已经拖动完
if (state == 2){
switch (viewPager.getCurrentItem()) {
case PAGER_ONE:
setSelect();
tvBook.setSelected(true);
break;
case PAGRT_TWO:
setSelect();
tvProgram.setSelected(true);
break;
case PAGER_THREE:
setSelect();
tvMe.setSelected(true);
break;
}
}
}
});
}
private void setSelect(){
tvMe.setSelected(false);
tvBook.setSelected(false);
tvProgram.setSelected(false);
}
// private void hideFragment(android.support.v4.app.FragmentTransaction transaction) {
// if(meFragment != null) {
// transaction.hide(meFragment);
// }
// if (bookFragment != null){
// transaction.hide(bookFragment);
// }
// if (programFragment != null){
// transaction.hide(programFragment);
// }
// }
//
// @Override
// public void onClick(View v) {
// android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
// hideFragment(transaction);
// switch (v.getId()) {
// case R.id.tv_me_act:
// setSelect();
// tvMe.setSelected(true);
// if (meFragment == null){
// meFragment = new MeFragment();
// transaction.add(R.id.fl_content,meFragment);
// }else{
// transaction.show(meFragment);
// }
// break;
// case R.id.tv_book_act:
// setSelect();
// tvBook.setSelected(true);
// if (bookFragment == null){
// bookFragment = new BookFragment();
// transaction.add(R.id.fl_content,bookFragment);
// }else{
// transaction.show(bookFragment);
// }
// break;
// case R.id.tv_program_act:
// setSelect();
// tvProgram.setSelected(true);
// if (programFragment == null){
// programFragment = new ProgramFragment();
// transaction.add(R.id.fl_content,programFragment);
// }else{
// transaction.show(programFragment);
// }
// break;
// }
// transaction.commit();
//
// }
}
与上一节有点类似,不同就在于ViewPager,调用ViewPager的setOnPageChangeListener()方法,重写三个方法,当滚动状态改变时,改变导航栏的状态。
点击事件改变导航栏的状态并改变ViewPager的currentItem。
(Fragment + ViewPager) + RecyclerView
先看效果图:
先说思路:
- 首先创建三个Fragment,继承自Fragment
- 将Fragment添加到ViewPager中
遇到的坑:
使用ViewPager要利用适配器来绑定数据,ViewPager的适配器可以继承FragmentPagerAdapter或者PagerAdapter,我一开始继承是PagerAdapter,
然后把Fragment作为View添加到ViewPager中,
package example.com.fragmentpractice;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* Created by csjy on 2017/5/5.
*/
public class TopViewPagerAdapter extends PagerAdapter {
private List<View> mList;
public TopViewPagerAdapter (List<View> mList) {
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mList.get(position));
return mList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
然后把Fragment作为View添加到ViewPager中,
package example.com.fragmentpractice.fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import example.com.fragmentpractice.ListviewAdapter;
import example.com.fragmentpractice.MyApplication;
import example.com.fragmentpractice.R;
import example.com.fragmentpractice.TopViewPagerAdapter;
/**
* Created by csjy on 2017/5/5.
*/
public class MeFragment extends Fragment implements View.OnClickListener{
private ArrayList<View> mList;
private List<String> stringList;
// private ListView listView;
private RecyclerView recyclerView;
private Context context;
private TextView tvText1,tvText2,tvText3,tvText4,tvText5;
private ViewPager viewPager;
private ListviewAdapter listviewAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_me,container,false);
mList = new ArrayList<View>();
mList.add(inflater.inflate(R.layout.view_text1,null));
mList.add(inflater.inflate(R.layout.view_text2,null));
mList.add(inflater.inflate(R.layout.view_text3,null));
mList.add(inflater.inflate(R.layout.view_text4,null));
mList.add(inflater.inflate(R.layout.view_text5,null));
initDatas();
initView(view);
initListener();
if(viewPager.getCurrentItem() == 0){
tvText1.setSelected(true);
}
return view;
}
private void initDatas(){
stringList = new ArrayList<String>();
for(int i = 0; i < 20; i++){
stringList.add("Text " + i);
}
}
private void initListener() {
tvText1.setOnClickListener(this);
tvText2.setOnClickListener(this);
tvText3.setOnClickListener(this);
tvText4.setOnClickListener(this);
tvText5.setOnClickListener(this);
}
private void initView(View view) {
context = MyApplication.getContext();
tvText1 = (TextView)view.findViewById(R.id.tv_top_1);
tvText2 = (TextView) view.findViewById(R.id.tv_top_2);
tvText3 = (TextView) view.findViewById(R.id.tv_top_3);
tvText4 = (TextView) view.findViewById(R.id.tv_top_4);
tvText5 = (TextView) view.findViewById(R.id.tv_top_5);
viewPager = (ViewPager) view.findViewById(R.id.view_pager);
TopViewPagerAdapter adapter = new TopViewPagerAdapter(mList);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
context = MyApplication.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View view1 = inflater.inflate(R.layout.view_text1,null);
recyclerView = (RecyclerView)view1.findViewById(R.id.lv_view_text1);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
listviewAdapter = new ListviewAdapter(context,stringList);
recyclerView.setAdapter(listviewAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
Fragment fragment = null;
if (state == 2){
switch (viewPager.getCurrentItem()){
case 0:
setSelect();
tvText1.setSelected(true);
break;
case 1:
setSelect();
tvText2.setSelected(true);
break;
case 2:
setSelect();
tvText3.setSelected(true);
break;
case 3:
setSelect();
tvText4.setSelected(true);
break;
case 4:
setSelect();
tvText5.setSelected(true);
break;
}
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_top_1:
setSelect();
tvText1.setSelected(true);
viewPager.setCurrentItem(0);
break;
case R.id.tv_top_2:
setSelect();
tvText2.setSelected(true);
viewPager.setCurrentItem(1);
break;
case R.id.tv_top_3:
setSelect();
tvText3.setSelected(true);
viewPager.setCurrentItem(2);
break;
case R.id.tv_top_4:
setSelect();
tvText4.setSelected(true);
viewPager.setCurrentItem(3);
break;
case R.id.tv_top_5:
setSelect();
tvText5.setSelected(true);
viewPager.setCurrentItem(4);
break;
}
}
private void setSelect(){
tvText1.setSelected(false);
tvText2.setSelected(false);
tvText3.setSelected(false);
tvText4.setSelected(false);
tvText5.setSelected(false);
}
}
虽然看着合情合理。。然而产生了坑
运行起来告诉我这个错误,一开始很懵逼,好好想想,Fragment只是布局被添加进来,并没有被实例化,所以我在点击事件和滑动事件中都实例化了Fragment,然而还是提示没有适配器,好气啊!!所以我决定换个适配器!!成功啦~
首先fragment的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Background">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
package example.com.fragmenttest2.fragment;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import example.com.fragmenttest2.R;
import example.com.fragmenttest2.adapter.RecyclerAdapter;
import example.com.fragmenttest2.util.MyApplication;
/**
* Created by csjy on 2017/5/5.
*/
public class MeFragment extends android.support.v4.app.Fragment {
private RecyclerView recyclerView;
private Context context;
private RecyclerAdapter adapter;
private List<String> mList;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_me,container,false);
initData();
initView(view);
return view;
}
private void initData() {
mList = new ArrayList<String>();
for (int i = 0; i < 50; i++){
mList.add("Test " + i);
}
}
private void initView(View view) {
context = MyApplication.getContext();
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
adapter = new RecyclerAdapter(context,mList);
recyclerView.setAdapter(adapter);
}
}
activity的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="example.com.fragmenttest2.MainActivity">
<LinearLayout
android:id="@+id/ll_tab"
android:layout_width="match_parent"
android:layout_height="65dp"
android:orientation="horizontal"
android:layout_margin="2dp"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/tv_act_book"
style="@style/tabTheme"
android:drawableTop="@drawable/book_selector"
android:text="Book"/>
<TextView
android:id="@+id/tv_act_program"
style="@style/tabTheme"
android:drawableTop="@drawable/program_selector"
android:text="Program"/>
<TextView
android:id="@+id/tv_act_me"
style="@style/tabTheme"
android:drawableTop="@drawable/me_selector"
android:text="Me"/>
</LinearLayout>
<View
android:id="@+id/line_view"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/line"
android:layout_above="@+id/ll_tab"/>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/line_view"></android.support.v4.view.ViewPager>
</RelativeLayout>
Activity:
package example.com.fragmenttest2;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import example.com.fragmenttest2.adapter.ViewPagerAdapter;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView tvBook,tvProgram,tvMe;
private ViewPager viewPager;
private List<View> mList;
private LayoutInflater inflater;
public static final int PAGER_ONE = 0;
public static final int PAGER_TWO = 1;
public static final int PAGER_THREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initViewPager();
initListener();
if (viewPager.getCurrentItem() == 0){
tvBook.setSelected(true);
}
}
private void initListener() {
tvBook.setOnClickListener(this);
tvProgram.setOnClickListener(this);
tvMe.setOnClickListener(this);
}
private void initViewPager() {
mList = new ArrayList<View>();
inflater = LayoutInflater.from(this);
mList.add(inflater.inflate(R.layout.fragment_book,null));
mList.add(inflater.inflate(R.layout.fragment_program,null));
mList.add(inflater.inflate(R.layout.fragment_me,null));
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == 2){
switch (viewPager.getCurrentItem()){
case 0:
setSelect();
tvBook.setSelected(true);
break;
case 1:
setSelect();
tvProgram.setSelected(true);
break;
case 2:
setSelect();
tvMe.setSelected(true);
break;
}
}
}
});
}
private void initView() {
tvBook = (TextView) this.findViewById(R.id.tv_act_book);
tvProgram = (TextView) this.findViewById(R.id.tv_act_program);
tvMe = (TextView) this.findViewById(R.id.tv_act_me);
viewPager = (ViewPager) this.findViewById(R.id.view_pager);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_act_book:
setSelect();
tvBook.setSelected(true);
viewPager.setCurrentItem(0);
break;
case R.id.tv_act_program:
setSelect();
tvProgram.setSelected(true);
viewPager.setCurrentItem(1);
break;
case R.id.tv_act_me:
setSelect();
tvMe.setSelected(true);
viewPager.setCurrentItem(2);
break;
}
}
private void setSelect(){
tvMe.setSelected(false);
tvProgram.setSelected(false);
tvBook.setSelected(false);
}
}
ViewPager的adapter
package example.com.fragmenttest2.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import example.com.fragmenttest2.MainActivity;
import example.com.fragmenttest2.fragment.BookFragment;
import example.com.fragmenttest2.fragment.MeFragment;
import example.com.fragmenttest2.fragment.ProgramFragment;
/**
* Created by csjy on 2017/5/5.
*/
public class ViewPagerAdapter extends FragmentPagerAdapter {
private MeFragment meFragment;
private BookFragment bookFragment;
private ProgramFragment programFragment;
private static final int PAGER_COUNT = 3;
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case MainActivity.PAGER_ONE:
fragment = bookFragment;
break;
case MainActivity.PAGER_TWO:
fragment = programFragment;
break;
case MainActivity.PAGER_THREE:
fragment = meFragment;
break;
}
return fragment;
}
@Override
public int getCount() {
return PAGER_COUNT;
}
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
meFragment = new MeFragment();
bookFragment = new BookFragment();
programFragment = new ProgramFragment();
}
}
在构造方法中实例化三个Fragment,在getItem方法中定义一个Fragment,将相应的Fragment赋值给它并返回。再运行程序,就是效果图。
Fragment + (ViewPager + ragment + RecyclerView)
效果图:
底部Fragment,内容ViewPager + Fragment+RecyclerView,可能有些奇怪,内容想实现类似的效果直接用ViewPager + RecyclerView就可以,为什么还要加个Fragment,因为我测试只用两个还是会提示RecyclerView找不到适配器,我认为可能RecyclerView所在的类没有被实例化,所以采取了
Fragment + (ViewPager + ragment + RecyclerView)
代码与前面的无二。