简述:
方法的作用
onAttach()
当Fragment与Activity发生关联时调用。
onCreate()
当创建Fragment实例时,系统回调的方法。在该方法中,需要对一些必要的组件进行初始化,以保证这个组件的实例在Fragment处于pause或stop状态时仍然存在。
onCreateView()
当第一次在Fragment上绘制UI时,系统回调的方法。该方法返回一个View对象,该对象表示Fragment的根视图;若Fragment不需要展示视图,则该方法可以返回null。
onActivityCreated()
当Activity的onCreate()返回时调用。
onStart()
onResume()
onPause()
当用户离开Fragment时回调的方法(并不意味着该Fragment被销毁)。在该方法中,可以对Fragment的数据信息做一些持久化的保存工作,因为用户可能不再返回这个Fragment。
onShop()
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用。
onDestory()
当Fragment销毁时调用。
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用。
优点
Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
Fragment 解决Activity间的切换不流畅,轻量切换。
Fragment 替代TabActivity做导航,性能更好。
Fragment 在4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。
Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能
使用
用按钮切换
private void initView() {
A = (Button) findViewById(R.id.A);
B = (Button) findViewById(R.id.B);
C = (Button) findViewById(R.id.C);
A.setOnClickListener(this);
B.setOnClickListener(this);
C.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.A:
//1.创建待添加的fragment页面
LeftFragment leftFragment = new LeftFragment();
replaceFragment(leftFragment);
break;
case R.id.B:
//1.创建待添加的fragment页面
RightFragment rightFragment = new RightFragment();
replaceFragment(rightFragment);
break;
case R.id.C:
//1.创建待添加的fragment页面
AFragment aFragment = new AFragment();
replaceFragment(aFragment);
break;
}
}
private void replaceFragment(Fragment fragment) {
//2.获取管理器类
FragmentManager manager = getSupportFragmentManager();
//3.开启事物
FragmentTransaction transaction = manager.beginTransaction();
//4.添加或替换
transaction.replace(R.id.content,fragment);
//5.提交事物
transaction.commit();
}
2.可是一层一层倒退的(有个的add增加,hide隐藏,show实现的结合)
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
//隐藏所有页面
if (aFragment!=null){
transaction.hide(aFragment);
}
if (bFragment!=null){
transaction.hide(bFragment);
}
switch (v.getId()) {
case R.id.btn1:
if (aFragment == null){//判断为空,创建页面,添加页面
aFragment = new AFragment();
transaction.add(R.id.fl,aFragment);
}else{//判断不为空、显示页面
transaction.show(aFragment);
}
break;
case R.id.btn2:
if (bFragment== null){//判断为空,创建页面,添加页面
bFragment = new BFragment();
transaction.add(R.id.fl,bFragment);
}else{//判断不为空、显示页面
transaction.show(bFragment);
}
break;
}
transaction.addToBackStack(null);//回退栈
transaction.commit();
3.在activity中直接获取到fragment中控件(静,动态)
private void initView() {
mBta = (Button) findViewById(R.id.bta);
mBta.setOnClickListener(this);
//寻找动态的fragment并赋予帧布局中
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
AFragment aFragment = new AFragment();
transaction.replace(R.id.content,aFragment,"aa");
transaction.commit();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bta:
// Activity获取Fragment对象(静态方式)
// Fragment fragmentById =getSupportFragmentManager().findFragmentById(R.id.fm); //在xml中的fragment的id
// View view = fragmentById.getView();///获取Fragment中的根View控件
// Button viewById = view.findViewById(R.id.f);//通过View获取按钮控件
// viewById.setText("Activity获取Fragment对象(静态方式)");
Fragment aa = getSupportFragmentManager().findFragmentByTag("aa");
View view = aa.getView();
Button button = view.findViewById(R.id.f);
button.setText("Activity获取Fragment对象(动态方式)");
break;
}
}
4.在fragment中直接更改activity中的控件
FragmentActivity activity = getActivity(); //Fragment获取Activirty对象
Button button = activity.findViewById(R.id.btnA);//通过activity获取控件
button.setText("Fragment获取Activirty对象");//设置控件内容
5.activity-fragment的穿值方法
1.在创建之前传
//第一种:用过有参构造
fragment:
private String name;
private int age;
@SuppressLint("ValidFragment")
public AFragment(String name, int age) {
this.name = name;
this.age = age;
}
activity:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
//第一种:用过有参构造
AFragment fragment = new AFragment("赵龙", 19);
transaction.replace(R.id.content, aFragment);
transaction.commit();
//第二种:用bundle
activity:
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
//第二种:用bundle
Bundle bundle = new Bundle();
bundle.putString("name","小明");
bundle.putString("age","90");
AFragment aFragment = new AFragment();
aFragment.setArguments(bundle);
transaction.replace(R.id.content, aFragment);
transaction.commit();
fragment:
Bundle arguments = getArguments();
String name = arguments.getString("name");
String age = arguments.getString("age");
mAbt.setText(name+":"+age);
2.在创建之后传
activity:
aFragment.setName("熊大",12);
fragment:
创建set方法
//给已有的改变
public void setName(String name,int age) {
mAbt.setText(name+":"+age);
}
6.fragment-activity的穿值方法
fragment:
//1.定义接口
private AA aa;
public void setAa(AA aa) {
this.aa = aa;
}
public interface AA{
void send(String name,String age);
}
//3.接口回调
if(aa!=null){
aa.send("dsa","dasdas");
}
activity:
//2.传递对象实现接口重写方法
blankFragment.setSendDataToActivity(this);
//接口回调数据刷新
@Override
public void send(String str1, String str2) {
btnA.setText(str1+":"+str2);
}
7.使用ViewPager绑定静态fragment
private TabLayout tab;
private ViewPager vp;
private ArrayList<Fragment> list;
private ArrayList<String> title;
private MyFragmentAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
initView();
}
private void initView() {
tab = (TabLayout) findViewById(R.id.tab);
vp = (ViewPager) findViewById(R.id.vp);
list = new ArrayList<>();
list.add(new AFragment());
list.add(new BFragment());
list.add(new CFragment());
title = new ArrayList<>();
title.add("新闻");
title.add("娱乐");
title.add("汽车");
adapter = new MyFragmentAdapter(getSupportFragmentManager(),list,title);
vp.setAdapter(adapter);
//(静态绑定)tab与vp设置页面绑定
tab.setupWithViewPager(vp);
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="30dp"
app:tabMode="scrollable"
android:id="@+id/tab"
app:tabMaxWidth="0dp"
>
</android.support.design.widget.TabLayout>
配置器 继承 extends FragmentPagerAdapter
8使用ViewPager绑定动态fragment (复用)
public class MainActivity extends AppCompatActivity {
private TabLayout tab;
private ViewPager vp;
private ArrayList<Fragment> list;
private MyFragmentAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
tab = (TabLayout) findViewById(R.id.tab);
vp = (ViewPager) findViewById(R.id.vp);
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
//创建ViewPager中Fragment
list.add(new BlankFragment("内容"+i));
//创建TabLayout中的显示标题
tab.addTab(tab.newTab().setText("标题"+i));
}
//适配器
adapter = new MyFragmentAdapter(getSupportFragmentManager(),list);
vp.setAdapter(adapter);
//相互绑定
tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {//通过选择对应的tab,切换vp的位置
@Override
public void onTabSelected(TabLayout.Tab tab) {
vp.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
vp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));//通过vp的滑动,选择tab的位置
}
}
fragment与单选按钮的绑定
/**
* 初始化主页面ViewPager+Fragment+RadioGroup
*/
private void initViewPager() {
//数据源
list = new ArrayList<>();
list.add(new HomeFragment());
list.add(new HomeFragment());
list.add(new HomeFragment());
list.add(new HomeFragment());
list.add(new HomeFragment());
//适配器
adapter = new MyMainPagerAdapter(getSupportFragmentManager(),list);
vp.setAdapter(adapter);
//设置默认选中页面
rg.check(R.id.home);
vp.setCurrentItem(0);
//相互关联
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.home:
vp.setCurrentItem(0);
break;
case R.id.knowledge:
vp.setCurrentItem(1);
break;
case R.id.navigation:
vp.setCurrentItem(2);
break;
case R.id.project:
vp.setCurrentItem(3);
break;
case R.id.me:
vp.setCurrentItem(4);
break;
}
}
});
vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int position) {
switch (position){
case 0:
rg.check(R.id.home);
break;
case 1:
rg.check(R.id.knowledge);
break;
case 2:
rg.check(R.id.navigation);
break;
case 3:
rg.check(R.id.project);
break;
case 4:
rg.check(R.id.me);
break;
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
}
fragment的嵌套
if (msg.what == 0x001){
String str = (String) msg.obj;
//数据解析
Gson gson = new Gson();
ProjectTabBean projectTabBean = gson.fromJson(str, ProjectTabBean.class);
//数据判断
if (projectTabBean!=null&&projectTabBean.getData()!=null){
list = new ArrayList<>();//创建数据源
List<ProjectTabBean.DataBean> data = projectTabBean.getData();
//循环添加页面、tab栏
for (int i = 0; i < data.size(); i++) {
list.add(new ProjectListFragment(data.get(i).getId()+""));//创建Fragment
tab.addTab(tab.newTab().setText(data.get(i).getName()));//创建Tab
}
//设置适配器
1主要是这个 //Fragment嵌套使用getChildFragmentManager()/进行管理切换
adapter = new MyProjectPageAdapter(getChildFragmentManager(),list);
vp.setAdapter(adapter);
//相互关联
tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
vp.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
vp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));
}
}
}
fragment的切换(隐藏现实)
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private Toolbar toobar;
private FrameLayout fl;
private LinearLayout ll;
private NavigationView na;
private DrawerLayout Dl;
private int Type = 0;
private int WANANDROID = 0;
private int SHOUCHANG = 1;
private int SHEZHI = 2;
private int GUANYU = 3;
private FragmentManager manager;
private ArrayList<Fragment> list;
private TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
toobar = (Toolbar) findViewById(R.id.toobar);
fl = (FrameLayout) findViewById(R.id.fl);
ll = (LinearLayout) findViewById(R.id.ll);
na = (NavigationView) findViewById(R.id.na);
Dl = (DrawerLayout) findViewById(R.id.Dl);
title = (TextView) findViewById(R.id.title);
na.setItemIconTintList(null);
na.setNavigationItemSelectedListener(this);
initcehua();
initFragments();
manager = getSupportFragmentManager();
initMoRen();
}
private void initMoRen() {
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fl, list.get(0));
transaction.commit();
}
private void initFragments() {
list = new ArrayList<>();
list.add(new wan_fragment());
list.add(new shou_Fragment());
list.add(new she_Fragment());
list.add(new guan_Fragment());
}
private void initcehua() {
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, Dl, toobar, R.string.app_name, R.string.app_name);
Dl.addDrawerListener(toggle);
toggle.syncState();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.A:
SwicheFragemnt(WANANDROID);
break;
case R.id.B:
SwicheFragemnt(SHOUCHANG);
break;
case R.id.C:
SwicheFragemnt(SHEZHI);
break;
case R.id.D:
SwicheFragemnt(GUANYU);
break;
}
Dl.closeDrawer(Gravity.LEFT);
return true;
}
/**
* 切换碎片
* @param type ,除了是类型外,还是 position
*/
private void SwicheFragemnt(int type) {
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = list.get(type);
//fragment是否有添加过
if (!fragment.isAdded()){
transaction.add(R.id.fl, fragment);
}
//隐藏上一个碎片
Fragment lastFragment = list.get(Type);
transaction.hide(lastFragment);
//显示碎片
transaction.show(fragment);
transaction.commit();
//切换完成之后,当前的fragmnet就是下一次切换要隐藏的Fragmnet
Type = type;
}
}
布局使用的帧布局
网友评论