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 的关联时调用。3.实践(在Activity中添加Fragmen通过Log观察两者)
- 分别重写Activity。Fragment所有的生命周期方法
-
- onAttach()
和onCreate()
只在 Fragment 与 Activity 第一次关联时调用。- onDestroy()
和onDetach()
只在 Fragment 的宿主 Activity 销毁时才会被调用。- - 将 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() |