Fragment称为Android中的碎片,类似Activity,能够包含Button、Text等其他基本组件.不同的是,同一个Activity中可以包含多个Fragment,实现手机或平板设备上分屏的效果.
1基本使用方式.
和MainActivity类似,先在layout中定义布局left_fragment.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_left"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="LeftButton"/>
</LinearLayout>
然后定义继承自android.support.v4.app.Fragment的类LeftFragment,在onCreateView方法中使用定义的left_fragment布局.
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
return view;
}
}
接下来就可以在activity_main布局中使用.
<fragment
android:id="@+id/fragment_left"
android:name="com.example.zhudong.fragmenttesttwo.LeftFragment"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight = "1"/>
2在Activity中动态添加Fragment.
上面属于静态添加Fragment的方式.还可以通过FragmentManager,在Activity中动态添加Fragment.在activity_main中添加FrameLayout布局.
<fragment
android:id="@+id/fragment_left"
android:name="com.example.zhudong.fragmenttesttwo.LeftFragment"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight = "1"/>
<FrameLayout
android:id="@+id/layout_right"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight = "1"/>
在MainActivity中添加按钮的点击事件.
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button leftBtn = (Button)findViewById(R.id.btn_left);
leftBtn.setOnClickListener(this);
}
public void changeBtnText(String text) {
Button btn = (Button) findViewById(R.id.btn_left);
btn.setText(text);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_left: {
RightFragment rightFragment = new RightFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.layout_right, rightFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
}
点击LeftButton后,首先创建新的rightFragment,用于替换.其次通过Activity的getSupportManager方法得到FragmentManager,然后通过beginTransaction获得FragmentTransaction类.调用replace方法并提交.实现rightFragment替换右边的FrameLayout.
其中添加addToBackStack语句,可以将FragmentTransaction添加到返回栈,这样再按下back控制键时,就能实现回到原来的FrameLayout状态.
3Fragment与Activity的相互通信.
(1)在Fragment可以通过getActivity方法得到Activity.比如,在上个例子中,我们想要在右边的FrameLayout被替换成RightFragment时,修改右边LeftButton的显示文字,可以在创建Fragment时,调用MainActivity中的changeBtnText方法.
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.changeBtnText("success");
return view;
}
(2)在Activity中可以通过getSupportFragmentManager方法得到FragmentManager,然后通过其findFragmentById的方法寻找相关联的Fragment.
4Fragment的生命周期.
和Activity的7个回调方法(onCreat,onStart,onResume,onPause,onStop,onDestroy,onRestart)相比,Fragment只有5个回调方法.详细如下:
onAttach: Fragment和活动建立关联时调用;
onCreateView: Fragment加载布局时调用;
onActivityCreated:确保相关联的Activity创建完毕时调用;
onDestroyView: Fragment被移除时调用;
onDetach: Fragment和关联的Activity解除关联的时候调用;
总结:Fragment和Activity类似,都是作为加载layout,处理逻辑的容器.可以加载到Intent的返回栈,也可以和Activity实现相互通信.并且和Activity一样有自己的生命周期回调函数.