Fragment 是从Android3.0以后出现的新技术,今天我们就用Fragment+Viewpager做一个模仿微信的demo,现在基本不管哪个Android项目都会用到Fragment,所以Fragment就变得很重要,所以就仔细将这边博文看了
基本大家也都了解Fragment的原理,这个demo需要用到以下文件
没个Fragment都需要一个xml文件,也就是xx_fragment.xml,也有对应的Java文件,但命名就要规范XXFragment.java(不需要到AndroidManifest.xml中配置)
还有Viewpager需要用到一个xml,activity_main.xml,这个xml文件用到了一个RadioGroup(单选组)
java文件为MainActivity.java(需要到AndroidManifest.xml(一般默认生成,其他新建的Activity需要手动配置))
上面提到了需要的文件,
xx_fragment.xml(模仿微信发现页面 (其他类似就不一一贴上了))
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:text="发现"
android:background="#0000ff"
/>
</LinearLayout>
XXFragment.java
package com.example.android_10text;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;--这个是重点在继承Fragment到这个包,导其他的包会报错
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Administrator on 2017/6/15 0015.
*/
public class FindFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment_find,null);
return v;
}
}
activity_main.xml
以下是显示页面的布局,这个可以根据自己的喜好来
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent" tools:context="com.example.android_10text.MainActivity">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:id="@+id/vp_main_view"
>
</android.support.v4.view.ViewPager>
<RadioGroup
android:id="@+id/rg_main_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D4D4D4"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_main_rg_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:drawableTop="@drawable/selector_radiobutton"
android:checked="true"
android:gravity="center"
android:text="微信"
android:textSize="20sp"
/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:button="@null"
android:drawableTop="@drawable/selector_radiobutton"
android:gravity="center"
android:text="通讯录"
android:textSize="20sp"
android:id="@+id/rb_main_rg_2"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:button="@null"
android:drawableTop="@drawable/selector_radiobutton"
android:gravity="center"
android:text="发现"
android:textSize="20sp"
android:id="@+id/rb_main_rg_3"
/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:button="@null"
android:drawableTop="@drawable/selector_radiobutton"
android:gravity="center"
android:text="我"
android:textSize="20sp"
android:id="@+id/rb_main_rg_4"
/>
</RadioGroup>
</LinearLayout>
MainActivity.java代码如下,
package com.example.android_10text;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vp_main_view;//viewpager控件
private List<Fragment> fragments=new ArrayList<>();//碎片集合
private RadioGroup rg_main_group;//单选组
private List<View> buttons;//单选框集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//拿viewpager控件
vp_main_view = (ViewPager) findViewById(R.id.vp_main_view);
//拿到单选组
rg_main_group = (RadioGroup) findViewById(R.id.rg_main_group);
//将每个碎片拿到
WeixinFragment weixinFragment=new WeixinFragment();
FindFragment findFragment=new FindFragment();
MeFragment meFragment=new MeFragment();
TxlFragment txlFragment=new TxlFragment();
//放进碎片集合中
fragments.add(weixinFragment);
fragments.add(findFragment);
fragments.add(txlFragment);
fragments.add(meFragment);
//设置自己写的适配器
vp_main_view.setAdapter(new MyAdapter(getSupportFragmentManager()));
//将当前页面获取焦点的单选框放入单选框集合中
buttons = rg_main_group.getTouchables();
//给Viewpager设置左右滑动监听
vp_main_view.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
//当前选择的页面
@Override
public void onPageSelected(int position) {
//通过页面来改变下面单选框的状态,跟随页面滑动变化而变化
RadioButton radioButton= (RadioButton) buttons.get(position);
radioButton.setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
//给单选组设置选择监听
rg_main_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
//一共4个单选框,每个单选框都设置ID,判断checkid(当前获取焦点的单选框的id)是否等于下面的ID,
//如果等于就改变Viewpager中的碎片,从而做到点击一个按钮改变一个页面
if(checkedId==R.id.rb_main_rg_1){
vp_main_view.setCurrentItem(0);
}else if(checkedId==R.id.rb_main_rg_2){
vp_main_view.setCurrentItem(1);
}else if(checkedId==R.id.rb_main_rg_3){
vp_main_view.setCurrentItem(2);
}else if(checkedId==R.id.rb_main_rg_4){
vp_main_view.setCurrentItem(3);
}
}
});
}
//自定义的Fragment的专属适配器
class MyAdapter extends FragmentPagerAdapter{
public MyAdapter(FragmentManager fragmentManager){
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
}
当这些步骤走下来,demo也就能运行出来,本来还想贴一张gif动图来展示demo效果,但是不会制作gif动图,有会制gif动图的小伙伴联系我,本人微信,15115984212