Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性

获取FragmentManage的方式:  

  getFragmentManager()
  getSupportFragmentManager //v4中FragmentActivity

主要的操作都是FragmentTransaction的方法

  FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

  transaction.add() //往Activity中添加一个Fragment

  transaction.remove() //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

  transaction.replace()//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

  transaction.hide() //当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,多的时候可能出现OOM异常,

  transaction.show()//显示之前隐藏的Fragment

  detach()会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

  attach()重建view视图,附加到UI上并显示。

  transatcion.commit()//提交一个事务

如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

  a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;

    也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

  b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

  c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。

    那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

Android Fragment动态添加 FragmentTransaction FragmentManager-LMLPHP

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.lesson10_fragment2.MainActivity"> <Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="添加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_remove"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="remove"
android:text="移除Fragment"
android:textAllCaps="false" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="replace"
android:text="替换Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_attach"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="attach"
android:text="附加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_detach"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="detach"
android:text="移除附加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="show"
android:text="显示Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_hide"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="hide"
android:text="隐藏Fragment"
android:textAllCaps="false" /> <!--动态加载,必须要给定一个空间用来加载Fragment 必须是一个FrameLayout !-->
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"> </FrameLayout>
</LinearLayout>

activity_main.xml

 public class TextFragment extends Fragment {

     @Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e("TAG","----TextFragment-----onAttach");
} @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("TAG","----TextFragment-----onCreate");
} @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.e("TAG","----TextFragment-----onCreateView");
EditText et = new EditText(getActivity());
et.setHint("动态加载的text");
return et;
} @Override
public void onStart() {
super.onStart();
Log.e("TAG","----TextFragment-----onStart");
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("TAG","----TextFragment-----onActivityCreated");
} @Override
public void onResume() {
super.onResume();
Log.e("TAG","----TextFragment-----onResume");
} @Override
public void onPause() {
super.onPause();
Log.e("TAG","----TextFragment-----onPause");
} @Override
public void onStop() {
super.onStop();
Log.e("TAG","----TextFragment-----onStop");
} @Override
public void onDestroyView() {
super.onDestroyView();
Log.e("TAG","----TextFragment-----onDestroyView");
} @Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG","----TextFragment-----onDestroy");
} @Override
public void onDetach() {
super.onDetach();
Log.e("TAG","----TextFragment-----onDetach");
}
}

TextFragment.java

 public class ImageFragment extends Fragment{

     @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ImageView img = new ImageView(getActivity());
img.setImageResource(R.mipmap.ic_launcher);
return img;
}
}

ImageFragment.java

 public class MainActivity extends AppCompatActivity {

     TextFragment textFragment;
ImageFragment imgFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textFragment = new TextFragment();
imgFragment = new ImageFragment();
} public void add(View v){
//创建事务
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//操作指令
ft.add(R.id.fl_content,textFragment);
//提交事务
ft.commit();
}
public void remove(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
ft.remove(textFragment);
ft.commit();
} public void replace(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
ft.replace(R.id.fl_content,imgFragment);
ft.commit();
} public void attach(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//重建视图,附件到UI上并显示
ft.attach(textFragment);
ft.commit();
}
public void detach(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
ft.detach(textFragment);
ft.commit();
}
public void show(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//显示之前隐藏的Fragment
ft.show(textFragment);
ft.commit();
}
public void hide(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
ft.hide(textFragment);
ft.commit();
}
}

MainActivity.java

04-19 15:14
查看更多