Android Fragment碎片使用
Fragment碎片是可嵌入到活动中的UI片段,能让程序更加合理利用大屏幕。
Fragment基本用法
在一个活动中添加2个Fragment,这两个Fragment平方活动空间。
1、创建左侧的Fragment布局left_fragment.xml
<?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/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Button"/>
</LinearLayout>创建右侧的Fragment布局right_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#00ff00"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:text="This is right fragment."/>
</LinearLayout>2、创建Fragment类
左侧Fragment类LeftFragment:
public class LeftFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
return view;
}
}右侧Fragment类RightFragment:
public class RightFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
return view;
}
}3、在活动布局中添加Fragment
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:name="com.jyoryo.app.android.study.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<fragment
android:id="@+id/right_fragment"
android:name="com.jyoryo.app.android.study.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>动态添加Fragment
动态添加Fragment分为以下几个步骤:
- 创建待添加的
Fragment; - 获取
FragmentManager; - 开启事务
fragmentManager.beginTransaction(); - 向容器添加或替换
Fragment,一般使用transaction.replace(R.id.right_layout, fragment); - 提交事务
transaction.commit()。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new AnotherRightFragment());
}
});
replaceFragment(new RightFragment());
}
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
}Fragment返回栈
在事务调用提交前调用addToBackStack方法,可以将一个事务添加至当前返回栈中。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();Fragment和Activity通信
在Activity中获取Fragment:
LeftFragment leftFragment = (LeftFragment)getSupportFragmentManager().findFragmentById(R.id.left_fragment);在Fragment中获取Activity:
MainActivity activity = (MainActivity)getActivity();Fragment生命周期
Fragment生命周期:
onAttach():当Fragment和活动建立关联的时候调用,被附加到Activity中去;onCreate():在创建Fragment时调用此方法。可以初始化一段资源等;onCreateView():为Fragment创建视图(加载布局)时调用;onActivityCreated():确保与Fragment相关联的Activity一定已经创建完毕时调用;onStart():当Fragment由不可见变为可见的时候调用;onResume():Fragment的Activity位于返回栈的栈顶,并且处于运行状态;onPause():当Fragment被添加到返回栈后,被移除或替换时调用;onStop():类似Activity的onStop();onDestroyView():当Fragment和Activity关联的视图被移除时调用;onDestroy():onDetach():当Fragment和Activity解除关联的时候调用。
使用Fragment布局技巧
Android应用也可以在平板上运行,为了充分利用大屏幕,可以采用左右分屏模式(双页模式),但手机上的屏幕一次只能显示其中一页的内容,在手机上需要用两个页面分开进行显示。
但是如何在运行时确定是使用双页模式还是单页模式?可以借助限定符来实现。
在默认的布局文件夹layout下活动的布局activiy_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- layout 下的Activity布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:name="com.jyoryo.app.android.study.s0301.LeftFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>在res目录下新建文件夹layout-large,创建活动的布局activiy_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- layout-large 下的Activity布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:name="com.jyoryo.app.android.study.s0301.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<fragment
android:id="@+id/right_fragment"
android:name="com.jyoryo.app.android.study.s0301.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>上面2个布局就能实现默认屏幕大小应用使用单页模式,大屏幕使用双页模式。
Android中常见限定符
按屏幕大小划分:
| 限定符 | 说明 |
|---|---|
| small | 提供给小屏幕设备的资源 |
| normal | 提供给中等屏幕设备的资源 |
| large | 提供给大屏幕设备的资源 |
| xlarge | 提供给超大屏幕设备的资源 |
按屏幕分辨率划分:
| 限定符 | 说明 |
|---|---|
| ldpi | 提供给低分辨率设备的资源(120dpi以下) |
| mdpi | 提供给中等分辨率设备的资源(120dpi~160dpi) |
| hdpi | 提供给高分辨率设备的资源(160dpi~240dpi) |
| xhdpi | 提供给超高分辨率设备的资源(240dpi~320dpi) |
| xxhdpi | 提供给超超高分辨率设备的资源(320dpi~480dpi) |
按屏幕方向划分:
| 限定符 | 说明 |
|---|---|
| land | 提供给横屏设备的分辨率 |
| port | 提供给竖屏设备的分辨率 |