Android基础之Fragment(1)

  • 一丶设计原理

           Android 在 Android 3.0(API 级别 11)中引入了片段,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改

  • 二丶创建Fragment

    1.在 Activity 的布局文件内声明片段

          <fragment
              android:id="@+id/fragment_1"
              android:name="com.example.wudelin.fragmentde.Fragment1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
        <fragment> 中的 android:name 属性指定要在布局中实例化的 Fragment 类。

      必须指定id或者tag,用来标识fragment

  • 2.或者通过编程方式将片段添加到某个现有 ViewGroup

          •           //获取FragmentManager实例
                      FragmentManager manager = getSupportFragmentManager();
                      //获取FragmentTransaction
                      FragmentTransaction transaction = manager.beginTransaction();
                      //将fragment1添加至viewGroup(父布局R.id.fragment_contains)
                      transaction.add(R.id.fragment_contains,fragment1);
                      //提交事务
                      transaction.commit();

                   
              - 提示:对于每个片段事务,您都可以通过在提交前调用 setTransition() 来应用过渡动画。

              •  - 继承自android.support.v4.app.Fragment

                •  - 传递到 add() 的第一个参数是 ViewGroup,即应该放置片段的位置,由资源 ID 指定,第二个参数是要添加的片段。

                  •           //将fragment1添加至viewGroup,将viewGroup中的所有片段全部移除
                              transaction.replace(R.id.fragment_contains,fragment2);
                              //加入回退栈
                              transaction.addToBackStack(null);
                  • 三丶与Activity的通信
                  • 1.Fragment->Activity
                    •   - Fragment中调用Activity
                    •     button.setOnClickListener(new View.OnClickListener() {
                             @Override
                             public void onClick(View v) {
                                  //fragment中通过getActivity()获取activity中的控件
                                  Log.d("wdl", "onClick: "+ getActivity()
                                       .findViewById(R.id.btn_replace).getId());
                             }
                          });
                    •   - Fragment给Activity传递数据
                      •     Fragment中编写内部接口->在Fragment的onAttach(Activity activity)方法中设置接口->Activity中实现接口,方法
                      •     实现如下:
                      •            Fragment中:
                        •            private FragListener listener;
                                     public interface FragListener{
                                         void fragData(String result);
                                     }
                          
                                     @Override
                                     public void onAttach(Context context) {
                                         super.onAttach(context);
                                         listener = (FragListener) context;
                                     }
                          •            Activity中:
                            •            @Override
                                         public void fragData(String result) {
                                               Log.d("wdl", "fragData: "+result);
                                               Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
                                         }
                            • 2.Activity->Fragment(通过setArguments(Bundle bundle))
                            •    - Activity中调用Fragment
                            •        Fragment1 fragment1 = (Fragment1) getSupportFragmentManager()
                                                  .findFragmentById(R.id.fragment_1);
                            •    - Activity给Fragment传递数据
                            •        --静态Fragment
                            •        Activity中:
                            •          //activity给静态加载的fragment传递数据
                                       Fragment1 fragment1 = (Fragment1) getSupportFragmentManager()
                                                  .findFragmentById(R.id.fragment_1);
                                       Bundle bundle = new Bundle();
                                       bundle.putString("hello_fragment1","我是activity传来的数据");
                                       fragment1.setArguments(bundle);
                            •        Fragment中:
                              •          @Override
                                         public void onActivityCreated(@Nullable Bundle savedInstanceState) {
                                               super.onActivityCreated(savedInstanceState);
                                               Log.d("wdl", "fragment onActivityCreated: ");
                                               String data = getArguments().getString("hello_fragment1");
                                               Toast.makeText(getActivity(),data,Toast.LENGTH_SHORT).show();
                                         }
                              •       --非静态
                              •       Activity中:
                                •         //activity通过setArguments传递数据给fragment
                                          Bundle bundle = new Bundle();
                                          bundle.putString("hello_fragment2","我是activity传来的数据");
                                          fragment2.setArguments(bundle);
                                          //获取FragmentManager实例
                                          FragmentManager manager = getSupportFragmentManager();
                                          //获取FragmentTransaction
                                          FragmentTransaction transaction = manager.beginTransaction();
                                          //将fragment1添加至viewGroup,将viewGroup中的所有片段全部移除
                                          transaction.replace(R.id.fragment_contains,fragment2);
                                          //加入回退栈
                                          transaction.addToBackStack(null);
                                          //提交事务
                                          transaction.commit();
                                  •       Fragment中:
                                    •         getArguments().getString("hello_fragment2");
                              • 四丶Fragment的生命周期
                              •    1.Activity与Fragment生命周期的对比
                              •                                       
            •   2.与Activity生命周期协调一致
            •        onAttach()
            •         在片段已与 Activity 关联时调用(Activity 传递到此方法内)。        onCreateView()        调用它可创建与片段关联的视图层次结构。        onActivityCreated()        在 Activity 的 onCreate() 方法已返回时调用。        onDestroyView()        在移除与片段关联的视图层次结构时调用。        onDetach()        在取消片段与 Activity 的关联时调用。fragment_lifecycle3.实践(在Activity中添加Fragmen通过Log观察两者)
            • 分别重写Activity。Fragment所有的生命周期方法
              • 进入APP:     
              • }PM}O~)YLY@JKZ6N`Q]9RP0 按Home:              
              • home重新进入APP:
  1. home结束APP:
    • over 5.总结
    1.         - onAttach()onCreate() 只在 Fragment 与 Activity 第一次关联时调用。
    2.         - onDestroy()onDetach() 只在 Fragment 的宿主 Activity 销毁时才会被调用。
    3.  -  将 Fragment 通过 addToBackStack() 只涉及 onCreateView()onDestroyView() 这之间的生命周期。add()replace() 不会对 Fragment 的生命周期产生影响,但 add() 方法会造成 Fragment 叠加显示。

Activity

Fragment

 

onCreate()(此方法完成后执行fragment的onActivityCreated())

 

onAttach()(最早执行)

onCreate()

onCreateView()(ui创建完成时)

onActivityCreated()

onStart()(后)

onStart()(先)

onResume(先)

onResume(后)

onPause()(后)

onPause()(先)

onStop()(后)

onStop()(先)

 

onDestroy()(最后执行)

onDestroyView()

onDestroy()

onDetach()

阅读更多
上一篇Activity的启动模式
下一篇Kotlin--基本类型(一)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭