• Android Fragment动态添加 FragmentTransaction FragmentManager


    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。

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:id="@+id/activity_main"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical"
     7     tools:context="com.example.lesson10_fragment2.MainActivity">
     8 
     9     <Button
    10         android:id="@+id/btn_add"
    11         android:layout_width="match_parent"
    12         android:layout_height="wrap_content"
    13         android:onClick="add"
    14         android:text="添加Fragment"
    15         android:textAllCaps="false" />
    16 
    17     <Button
    18         android:id="@+id/btn_remove"
    19         android:layout_width="match_parent"
    20         android:layout_height="wrap_content"
    21         android:onClick="remove"
    22         android:text="移除Fragment"
    23         android:textAllCaps="false" />
    24 
    25     <Button
    26         android:layout_width="match_parent"
    27         android:layout_height="wrap_content"
    28         android:onClick="replace"
    29         android:text="替换Fragment"
    30         android:textAllCaps="false" />
    31 
    32     <Button
    33         android:id="@+id/btn_attach"
    34         android:layout_width="match_parent"
    35         android:layout_height="wrap_content"
    36         android:onClick="attach"
    37         android:text="附加Fragment"
    38         android:textAllCaps="false" />
    39 
    40     <Button
    41         android:id="@+id/btn_detach"
    42         android:layout_width="match_parent"
    43         android:layout_height="wrap_content"
    44         android:onClick="detach"
    45         android:text="移除附加Fragment"
    46         android:textAllCaps="false" />
    47 
    48     <Button
    49         android:id="@+id/btn_show"
    50         android:layout_width="match_parent"
    51         android:layout_height="wrap_content"
    52         android:onClick="show"
    53         android:text="显示Fragment"
    54         android:textAllCaps="false" />
    55 
    56     <Button
    57         android:id="@+id/btn_hide"
    58         android:layout_width="match_parent"
    59         android:layout_height="wrap_content"
    60         android:onClick="hide"
    61         android:text="隐藏Fragment"
    62         android:textAllCaps="false" />
    63 
    64     <!--动态加载,必须要给定一个空间用来加载Fragment 必须是一个FrameLayout !-->
    65     <FrameLayout
    66         android:id="@+id/fl_content"
    67         android:layout_width="match_parent"
    68         android:layout_height="wrap_content">
    69 
    70     </FrameLayout>
    71 </LinearLayout>
    activity_main.xml
     1 public class TextFragment extends Fragment {
     2 
     3     @Override
     4     public void onAttach(Context context) {
     5         super.onAttach(context);
     6         Log.e("TAG","----TextFragment-----onAttach");
     7     }
     8 
     9     @Override
    10     public void onCreate(@Nullable Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         Log.e("TAG","----TextFragment-----onCreate");
    13     }
    14 
    15     @Nullable
    16     @Override
    17     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    18         Log.e("TAG","----TextFragment-----onCreateView");
    19         EditText et = new EditText(getActivity());
    20         et.setHint("动态加载的text");
    21         return et;
    22     }
    23 
    24     @Override
    25     public void onStart() {
    26         super.onStart();
    27         Log.e("TAG","----TextFragment-----onStart");
    28     }
    29 
    30     @Override
    31     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    32         super.onActivityCreated(savedInstanceState);
    33         Log.e("TAG","----TextFragment-----onActivityCreated");
    34     }
    35 
    36     @Override
    37     public void onResume() {
    38         super.onResume();
    39         Log.e("TAG","----TextFragment-----onResume");
    40     }
    41 
    42     @Override
    43     public void onPause() {
    44         super.onPause();
    45         Log.e("TAG","----TextFragment-----onPause");
    46     }
    47 
    48     @Override
    49     public void onStop() {
    50         super.onStop();
    51         Log.e("TAG","----TextFragment-----onStop");
    52     }
    53 
    54     @Override
    55     public void onDestroyView() {
    56         super.onDestroyView();
    57         Log.e("TAG","----TextFragment-----onDestroyView");
    58     }
    59 
    60     @Override
    61     public void onDestroy() {
    62         super.onDestroy();
    63         Log.e("TAG","----TextFragment-----onDestroy");
    64     }
    65 
    66     @Override
    67     public void onDetach() {
    68         super.onDetach();
    69         Log.e("TAG","----TextFragment-----onDetach");
    70     }
    71 }
    TextFragment.java
     1 public class ImageFragment extends Fragment{
     2 
     3     @Nullable
     4     @Override
     5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     6         ImageView img = new ImageView(getActivity());
     7         img.setImageResource(R.mipmap.ic_launcher);
     8         return img;
     9     }
    10 }
    ImageFragment.java
     1 public class MainActivity extends AppCompatActivity {
     2 
     3     TextFragment textFragment;
     4     ImageFragment imgFragment;
     5     @Override
     6     protected void onCreate(Bundle savedInstanceState) {
     7         super.onCreate(savedInstanceState);
     8         setContentView(R.layout.activity_main);
     9 
    10         textFragment = new TextFragment();
    11         imgFragment = new ImageFragment();
    12     }
    13 
    14     public void add(View v){
    15         //创建事务
    16         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    17         //操作指令
    18         ft.add(R.id.fl_content,textFragment);
    19         //提交事务
    20         ft.commit();
    21     }
    22     public void remove(View v){
    23         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    24         //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
    25         ft.remove(textFragment);
    26         ft.commit();
    27     }
    28 
    29     public void replace(View v){
    30         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    31         //使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
    32         ft.replace(R.id.fl_content,imgFragment);
    33         ft.commit();
    34     }
    35 
    36     public void attach(View v){
    37         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    38         //重建视图,附件到UI上并显示
    39         ft.attach(textFragment);
    40         ft.commit();
    41     }
    42     public void detach(View v){
    43         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    44         //会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
    45         ft.detach(textFragment);
    46         ft.commit();
    47     }
    48     public void show(View v){
    49         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    50         //显示之前隐藏的Fragment
    51         ft.show(textFragment);
    52         ft.commit();
    53     }
    54     public void hide(View v){
    55         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    56         //当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
    57         ft.hide(textFragment);
    58         ft.commit();
    59     }
    60 }
    MainActivity.java
  • 相关阅读:
    python函数练习题2
    python函数练习题1
    数字是否是10的整数倍
    关于循环的作业:登陆程序
    用for循环写这段代码
    while循环语句
    在CentOS8 上安装Python3
    时隔半年再写购物车程序并改进
    vue上传
    根据生日计算年龄
  • 原文地址:https://www.cnblogs.com/Claire6649/p/5997632.html
Copyright © 2020-2023  润新知