1.什么是Fragment?
Fragment是“碎片”,它可以表示Activity中的行为或用户界面部分。我们可以在一个Activity中用多个Fragment组合来构建多窗格的UI,以及在多个Activity中重复使用某个Fragment。它有自己的生命周期,能接受自己的输入,并且可以在 Activity 运行时添加或删除Fragment(有点像在不同 Activity 中重复使用的“子 Activity”
2.Fragment的静态加载怎么用?
1、编写Fragment的布局
2、在Activity中声明加载Fragment,一定要写id;
<fragment
android:id="@+id/fragment1"
android:name="layout.friendFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
3.Fragment的动态加载怎么用?
使用FragmentManager和FragmentTransaction
package com.example.yang.paopao;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1, btn2;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private HelloFragment helloFragment;
private ListFragment listFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
/**
* 初始化
*/
private void init() {
btn1 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
fragmentManager = getFragmentManager(); //调用FragmentManager()方法获取到FragmentManager
}
/**
* 按钮的点击事件
* @param v
*/
@Override
public void onClick(View v) {
fragmentTransaction = fragmentManager.beginTransaction(); //开启一个事务,通过调用beginTransaction()方法开启
switch (v.getId()) {
case R.id.btn1:
if (helloFragment == null) //判断这个Fragment是否实例化过,如果没有则实例化
helloFragment = new HelloFragment();
fragmentTransaction.replace(R.id.main_fragment, helloFragment); //向容器内加入Fragment
break;
case R.id.btn2:
if (listFragment == null)
listFragment = new ListFragment();
fragmentTransaction.replace(R.id.main_fragment, listFragment);
break;
default:
break;
}
fragmentTransaction.commit(); //提交事务
}
}
4.ViewPager+Fragment实现页卡滑动
创建3个Fragment并将其背景调成不同的颜色以便识别,然后在布局文件中添加ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
创建一个适配器类MyAdapter继承FragmentPagerAdapter
public class MyAdapter extends FragmentPagerAdapter {
private List<Fragment> list; //Fragment的集合
public MyAdapter(FragmentManager fm,List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position); //当前显示的Fragment
}
@Override
public int getCount() {
return list.size(); //Fragment的数量
}
}
public class ContactsActivity extends AppCompatActivity {
private FragmentManager fragmentManager;
private ViewPager viewPager;
private List<Fragment> list;
private MyAdapter myAdapter;
private Fragment1 fragment1;
private Fragment2 fragment2;
private Fragment3 fragment3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
init();
//实例化适配器
myAdapter = new MyAdapter(fragmentManager,list);
//获取布局中viewPager的id
viewPager = findViewById(R.id.viewPager);
//将适配器传入
viewPager.setAdapter(myAdapter);
//默认显示第一个页面
viewPager.setCurrentItem(0);
}
/**
* 初始化
*/
private void init() {
fragmentManager = getSupportFragmentManager();
fragment1 = new Fragment1();
fragment2 = new Fragment2();
fragment3 = new Fragment3();
//将Fragment放入list集合中
list = new ArrayList<>();
list.add(fragment1);
list.add(fragment2);
list.add(fragment3);
}
}
5. Fragment的生命周期
onStart()
onPause()
onDestroy()
onAttach()
Fragment和Activity建立关联的时候调用,被附加到Activity中去
onCreate()
系统会在创建Fragment时调用此方法。可以初始化一段资源文件等等。
onCreateView()
系统会在Fragment首次绘制其用户界面时调用此方法。 要想为Fragment绘制 UI,从该方法中返回的 View 必须是Fragment布局的根视图。如果Fragment未提供 UI,您可以返回 null。
onViewCreated()
在Fragment被绘制后,调用此方法,可以初始化控件资源。
onActivityCreated()
当onCreate(),onCreateView(),onViewCreated()方法执行完后调用,也就是Activity被渲染绘制出来后。
onPause()
系统将此方法作为用户离开Fragment的第一个信号(但并不总是意味着此Fragment会被销毁)进行调用。 通常可以在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
onDestroyView()
Fragment中的布局被移除时调用。
onDetach()
Fragment和Activity解除关联的时候调用。
但需要注一点是:除了onCreateView,其他的所有方法如果重写了,必须调用父类对于该方法的实现。
一般在启动Fragment的时候,它的生命周期就会执行这几个方法。
6.Frgment传值到activity
通过Bundle包装数据,发送数据给Fragment
Bundle bundle=new Bundle();
bundle.putString("name","张三");
benFragment.setArguments(bundle);
在Fragment中接收
Bundle bundle=getArguments();
String name=bundle.getString("name");
button.setText(name);
7.activity传值到Fragment
//1.在Fragment中定义一个接口,用于被Activity实现
public interface MyListener{
public void thank(String code);
}
//2.在Fragment中覆写onAttach方法
public void onAttach(Activity activity) {
myListener= (MyListener) activity;
super.onAttach(activity);
}
//3.在Fragment中中调用thank方法
private MyListener myListener;
myListener.thank(code);
4.在Activity中接口实现方法返回的参数就是接收到的数据
public void thank(String code) {
Toast.makeText(Main5.this,"已成功接收到"+code+",客气了",Toast.LENGTH_LONG).show();
}