一、什么是Fragment?
Fragment是显示在Activity中的碎片,它可以显示在Activity中,然后它也可以显示出一些内容。因为它拥有自己的生命周期,可以接收处理用户的事件,并且你可以在一个Activity中动态的添加,替换,移动不同的Fragment,因此对于信息的展示具有很大的便利性。
二、Fragment的生命周期
Fragment比Activity多了几个生命周期的回调方法
- onAttach(Activity) 当 Fragment与 Activity发生关联的时候调用
- onCreateView(LayoutInflater,ViewGroup,Bundle) 创建该Fragment的视图
- onActivityCreated(Bundle) 当Activity的onCreate方法返回时调用
- onDestroyView() 与onCreateView方法相对应,当该Fragment的视图被移除时调用
- onDetach() 与onAttach方法相对应,当Fragment 与 Activity取消关联时调用
生命周期:
MainFragmentActivity 与 AMainFragment
创建时生命周期:
onCreate(MainFragmentActivity )、
onAttach(AMainFragment)、onCreate(AMainFragment)、onCreateView(AMainFragment)、onActivityCreate(AMainFragment)、onStart(AMainFragment)、
onStart(MainFragmentActivity )、onResume(MainFragmentActivity )、
onResume(AMainFragment)
生命周期结束
MainFragmentActivity /AMainFragment
onPause(AMainFragment)、onPause(MainFragmentActivity )、onStop(AMainFragment)、onStop(MainFragmentActivity )、
onDestroyView(AMainFragment)、onDestroy(AMainFragment)、onDetach(AMainFragment)、
onDestroy(MainFragmentActivity )
实例:
MainFragmentActivity .java
public class MainFragmentActivity extends FragmentActivity {
public static final String TAG = "MainFragmentActivity";
private FragmentTransaction transaction;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_main);
replaceFragment(new AMainFragment());
((Button) findViewById(R.id.btn_a)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new AMainFragment());
}
});
((Button) findViewById(R.id.btn_b)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new BMainFragment());
}
});
}
private void replaceFragment(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
transaction = manager.beginTransaction();
transaction.replace(R.id.content,fragment);
transaction.commit();
}
}
activity_fragment_main.xml 是 MainFragmentActivity.java的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<Button
android:id="@+id/btn_a"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="AMain" />
<Button
android:id="@+id/btn_b"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="BMain" />
</LinearLayout>
</LinearLayout>
AMainFragment .java
public class AMainFragment extends Fragment {
private static final String TAG ="AMainFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_main_a, null);
Log.i(TAG,"onCreateView");
return inflate;
}
}
fragment_main_a.xml 是 AMainFragment .java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="Main_A" />
</LinearLayout>
BMainFragment .java
public class BMainFragment extends Fragment {
private static final String TAG ="BMainFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_main_b, null);
Log.i(TAG,"onCreateView");
return inflate;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="Main_B" />
</LinearLayout>
生命周期:
切换fragment
MainFragmentActivity 、AMainFragment 、BMainFragment
I/MainFragmentActivity: onCreate
I/AMainFragment: onAttach
onCreate
I/AMainFragment: onCreateView
onActivityCreated
I/AMainFragment: onStart
I/MainFragmentActivity: onStart
I/MainFragmentActivity: onResume
I/AMainFragment: onResume
I/BMainFragment: onAttach
onCreate
I/AMainFragment: onPause
onStop
onDestroyView
I/AMainFragment: onDestroy
onDetach
I/BMainFragment: onCreateView
I/BMainFragment: onActivityCreated
onStart
onResume
三、Fragment基本使用
动态加载Fragment中,FragmentTransaction类提供了方法完成增删等操作,完成后调用 __commit()__方法提交修改。
- add():往Activity里面添加一个片段;
- remove():从Activity中移除一个Fragment,如果被移除的Fragment没有添加到 回退栈 ,这个Fragment实例将被销毁。
- replace():使用另一个Fragment替换当前的,实际上是 remove() 然后 add() 的合体
- hinde():隐藏当前Fragment,仅不可见,不会销毁
- show():显示之前隐藏的Fragment
- detach():会将view从UI中移除,和 remove() 不同,此时fragment的状态依然由FragmentManager维护
- attach():重建view视图,附加到UI上并显示。
commit 方法一定要在Activity.onSaveInstance 之前调用
四、Fragment的回退栈
Fragment的回退栈是用来保存每一次Fragment事务发生的变化如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则推出当前Activity。
五、Fragment与Activity之间的通信
Fragment依附于Activity存在,因此于Activity之间的通信可以归纳为以下几点:
- []如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
- []如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过 getFragmentManager.findFragmentByTag() 或者 findFragmentById() 获得任何Fragment实例,然后进行操作。
- []Fragment中可以通过 getActivity() 得到当前绑定的Activity的实例,然后进行操作。
MainFragmentActivity .java
public class MainFragmentActivity extends FragmentActivity implements BMainFragment.BOnBtnClickListener, AMainFragment.AOneBtnClickListener {
public static final String TAG = "MainFragmentActivity";
private AMainFragment aMainFragment;
private BMainFragment bMainFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_main);
aMainFragment = new AMainFragment();
FragmentManager manager = getSupportFragmentManager();
transaction = manager.beginTransaction();
transaction.add(R.id.content, aMainFragment, "AMain");
transaction.commit();
Log.i(TAG, "onCreate");
}
@Override
public void onAOneBtnClick() {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.hide(aMainFragment);
if (null == bMainFragment) {
bMainFragment = new BMainFragment();
bMainFragment.setbOnBtnClickListener(this);
}
transaction.replace(R.id.content, bMainFragment, "BMain");
transaction.commit();
}
@Override
public void onBtnClick() {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.hide(bMainFragment);
if (null == aMainFragment) {
aMainFragment = new AMainFragment();
}
transaction.replace(R.id.content, aMainFragment, "AMain");
transaction.commit();
}
}
AMainFragment .java
public class AMainFragment extends Fragment {
private static final String TAG = "AMainFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_main_a, null);
Log.i(TAG, "onCreateView");
((Button)inflate.findViewById(R.id.btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getActivity() instanceof AOneBtnClickListener) {
((AOneBtnClickListener) getActivity()).onAOneBtnClick();
}
}
});
return inflate;
}
interface AOneBtnClickListener {
void onAOneBtnClick();
}
}
BMainFragment .java
public class BMainFragment extends Fragment {
private static final String TAG = "BMainFragment";
private BOnBtnClickListener bOnBtnClickListener;
public void setbOnBtnClickListener(BOnBtnClickListener bOnBtnClickListener) {
this.bOnBtnClickListener = bOnBtnClickListener;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_main_a, null);
Log.i(TAG, "onCreateView");
Button button = inflate.findViewById(R.id.btn);
button.setText("ASDG");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != bOnBtnClickListener) {
bOnBtnClickListener.onBtnClick();
}
}
});
return inflate;
}
interface BOnBtnClickListener {
void onBtnClick();
}
}