1. Fragment与Activity之间的关系
Fragment,碎片,提出最初是为了解决平板和手机屏幕大小不同,设计布局的问题,fragment通过Fragment Manager由Activity进行托管,可以根据屏幕大小不同的客户端加载不同的fragment.通俗的说,fragment就是为保证UI在不同大小屏幕上的兼容性而生的。
2. (视图层)Fragment.xml与Activity.xml之间的关系
首先,既然说是布局,那么fragment必不可少的就是布局文件,但是想要对控件进行操作,单单有一个布局是不够的,还需要布局中有各种控件。此处,本质上可以理解为,main_activity.xml文件创建容器,容器中填充的就是fragment.xml文件内容。main_activity.xml文件仅仅只是提供了一个空白的画板而已。所有的控件都包含在fragment.xml中。
//在布局文件中添加碎片
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/right_fragment"
android:name="com.example.fragmenttest.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
//注意这里需要通过android:name 属性来显式指明要添加的碎片类名,注意一定要将类的包名也加上。
3 (控制层)Fragment.java与MainActivity.java之间的关系
在活动运行时自动将碎片添加到活动中,MainActivity.java加载碎片,然后对于控件的各种操作均在Fragment.java中完成
这里可以对比下调用下一个Activity和加载碎片的区别。
从代码上来区分
Intent intent=new Intent(MainActivity.this,firstActivity.class);
startActivity(intent);
而动态加载碎片是比较复杂的,包括五个步骤:
(1)创建待添加的碎片
(2)获取FragmentManager(),在活动中可以直接调用getFragmentManager()方法得到
(3)开启一个事务,通过调用beginTransaction()方法开启。
(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.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.
beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
break;
default:
break;
}
}
}