一 基本概念
- 碎片(Fragment) 是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。
二 简单使用过程
- 新建一个碎片布局:
<!-- left_fragment.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<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 class的LeftFragment.class:
public class LeftFragment extends Fragment
{
//重写onCreateView()方法,并在其中通过LayoutInflater的inflater()方法将刚才定义的left_fragment.xml动态加载进来。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.left_fragement,
container, false);// 动态加载布局
return view;
}
}
- 修改activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_weight="1"设置权重为1 -->
<!-- abdroid:name 属性用来显示指定要添加的碎片类名,需要将类的包名也加上 -->
</LinearLayout>
- 完毕
三 动态添加碎片,并在碎片中模拟返回栈
- 步骤:
1.创建待添加的碎片实例
2.获取到FragmentManager,在Activity中可以直接调用getFragmentManager()方法得到
3.开启一个事务,通过调用beginTransaction()方法开启。Transaction:事务,业务
4.向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。
5.提交事务,调用commit() 方法完成 - 关键代码:
public class MainActivity extends Activity implements OnClickListener
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button007);
button.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
switch (v.getId())
{
case R.id.button007:
Log.d("onClick", "button007");
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction
.replace(R.id.right_layout, fragment);// 更改碎片
Log.d("onClick", "right_layout");
fragmentTransaction.addToBackStack(null);//通过调用该方法模拟类似于返回栈的效果,按下Back键可以回到上一个碎片
fragmentTransaction.commit();// 提交
break;
default:
break;
}
}
}
四 碎片和活动间通信
- 为方便碎片和活动之间进行通信,FragmentManager 提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片实例:
FragmentClass fragmentClass=(FragmentClass)getFragmentManager().findFragmentById(R.id.fragmentId);//在活动中得到相应碎片的实例,then,尽情调用碎片里的方法吧~~
MainActivity mainActivity=(MainActivity)getActivity();//在碎片中获得和当前碎片相关联的活动实例,当碎片中需要使用Context对象时,也可以使用getActivity()方法,因为获取到的活动本身就是一个Context对象。
碎片的生命周期
- 跟Activity的生命周期差不多哈~
五 关于限定符(Qualifiers)
对于一个App,要做到适配不同分辨率,不同大小的手机屏幕,可以利用动态加载布局的技巧,让程序能够根据设备的分辨率或者屏幕大小在运行的时候决定加载哪个布局,以达到更好的用户体验效果.合理使用限定符则可以实现这一点。
Android中一些常见的限定符:
使用:
例如:在res目录下新建一个layout-large文件夹,在这个文件夹下面新建一个activity_main.xml布局,其中large就是一个限定符,当屏幕被认为是large的设备时就会自动加载layout-large下的布局,而不会加载layout下的布局,然而在小屏幕的设备则会自动加载layou下的布局。
此外,还可以使用最小宽度限定符(Smallest-width Qualifiler)来更灵活地指定不同的设备加载相应的布局,例如,res下新建一个layout-sw600dp文件夹然后新建一个activity_main.xml布局,当设备的屏幕宽度大于600dp时就会加载layout-sw600dp/activity_main布局,而在屏幕宽度小于600dp的设备上运行时则仍然会加载默认的layout/activity_main布局。
六 官方文档
201510281433 By Xiong