fragment的生命周期
定义一个BaseFragment添加log来显示fragment的生命周期
<span style="font-size:10px;">package com.example.fragment;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class BaseFragment extends Fragment{
public static final String TAG = "BaseFragment";
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(getSimpleTag(), "onActivityCreated");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i(getSimpleTag(), "onActivityResult");
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.i(getSimpleTag(), "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(getSimpleTag(), "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.i(getSimpleTag(), "onCreateView");
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(getSimpleTag(), "onDestroy");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.i(getSimpleTag(), "onDestroyView");
}
@Override
public void onDetach() {
super.onDetach();
Log.i(getSimpleTag(), "onDetach");
}
@Override
public void onResume() {
super.onResume();
Log.i(getSimpleTag(), "onResume");
}
@Override
public void onStart() {
super.onStart();
Log.i(getSimpleTag(), "onStart");
}
@Override
public void onStop() {
super.onStop();
Log.i(getSimpleTag(), "onStop");
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i(getSimpleTag(), "onViewCreated");
}
public String getSimpleTag() {
return TAG;
}
}
</span>
定义一个MyFragment继承自BaseFragment来显示内容
<span style="font-size:10px;">package com.example.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyFragment extends BaseFragment {
private String mText;
private String mSimpleTag;
public MyFragment(String text) {
mText = text;
mSimpleTag = TAG + " " + text;
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
TextView tv = new TextView(getActivity());
tv.setText(mText);
return tv;
}
@Override
public String getSimpleTag() {
return mSimpleTag;
}
}
</span>
将一个fragment添加到activity中
<span style="font-size:10px;">FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
f = new MyFragment(TAG_BOTTOM_A);
ft.add(R.id.fragment_bottom_layout, f, TAG_BOTTOM_A);
ft.commit();</span>
将一个fragment添加到backstack中,按返回键时会将此fragment移出栈
<span style="font-size:10px;">ft.addToBackStack(null);</span>
当使用replace方法添加fragment时,相当于使用了add 和remove方法,在此fragment前面添加的fragment不会显示,而使用show方法,不会造成这种现象。
<span style="font-size:10px;">FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (!f.isAdded()) {
ft.add(id, f, tag);
if (backStack) {
ft.addToBackStack(null);
}
}
ft.show(f);
ft.commit();</span>
Fragment家族常用的API
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~
a、获取FragmentManage的方式:
getFragmentManager() // v4中,getSupportFragmentManager
b、主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
transaction.add()
往Activity中添加一个Fragment
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transatcion.commit()//提交一个事务
注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。
上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。