Android碎片化UI fragment

1、 创建fragment容器布局(activity_main.xml)

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <FrameLayout
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>


2、 定义fragment视图的布局文件(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/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
    
</LinearLayout>



3 、 创建Fragment类(MyFragment.java)

在Fragment.onCreate(…)方法中,并没有生成fragment的视图。虽然在Fragment.onCreate(…)方法中配置了fragment实例,但创建和配置fragment视图是通过另一个fragment生命周期方法来完成的:Fragment.onCreateView(…)。

通过Fragment.onCreateView(…)方法生成fragment视图的布局,然后将生成的View返回给托管的activity。LayoutInflater以及ViewGroup是用来生成布局的必要参数。Bundle包含了供该方法在保存状态下重建视图所使用的数据。

Fragment的视图是通过调用inflater.inflate(…)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通常我们需要父视图来正确配置组件。第三个参数告知布局是否将生成的视图添加给父视图。这里,我们传入了false参数,因为我们将通过Activity代码的方式添加视图。

package com.example.fragmentdemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class MyFragment extends Fragment {

	private Button mButton;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		
		View v = inflater.inflate(R.layout.fragment, container,false);
		
		mButton=(Button) v.findViewById(R.id.button1);
		
		/*mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i=new Intent();
				i.setClass(getActivity(), MyActivity.class);
				getActivity().startActivity(i);
			}
		});*/
		
		return v;
		//return super.onCreateView(inflater, container, savedInstanceState);
	}
	
}

4、 在Activity中添加UI fragment到FragmentManager(MainActivity.java)

MainActivity继承FragmentActivity类,由getSupportFragmentManager()获得FragmentManager对象。或者不考虑版本兼容问题,也可以直接继承Activity并由getFragmentManager()获得FragmentManager对象。

FragmentManager类负责管理fragment并将它们的视图添加到Activity的视图层级结构中。具体管理fragment队列和fragment事务的回退栈。具体操作如下:

Fragment使用容器视图资源ID向FragmentManager获取fragment实例。如果获取的fragment在队列中存在,FragmentManager随即会将之返还。如果不存在,则Fragment获取不到fragment实例,fragment为null。那么由FragmentManager通过调用beginTransaction方法开启一个事务。使用add(…)方法实现向队列内加入fragment,add(…)方法需要传入容器视图资源ID和fragment的实例。最后调用commit()方法提交事务。

package com.example.fragmentdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

public class MainActivity extends FragmentActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		FragmentManager fm = getSupportFragmentManager();
		android.support.v4.app.Fragment fragment= fm.findFragmentById(R.id.fragmentContainer);
		
		if (fragment==null) {
			fragment = new MyFragment();
			fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit();
		}
		
	}
 

}

5、 Fragment生命周期

       a)        创建的流程

                   (Fragment)       onAttach() :      Fragment和Activity建立关联

                   (Activity)           onCreate() :    

                   (Fragment)       onCreateView():     为Fragment加载布局

                   (Fragment)       onActivityCreated()

 

        b)        销毁的流程

                   (Activity)           onResume()

                   (Activity)           onPause()

                   (Activity)           onStop()

                   (Fragment)       onDestroyView():   Fragment中的布局被移除

                   (Activity)           onDestroy()

                   (Fragment)       onDetach():     Fragment和Activity解除关联

《Android编程权威指南》之学习心得与笔记      by 2015.1.20