Android Fragment示例

Fragment功能與Activity相似,但Activity只能全屏顯示,Fragment可佔據任意大小屏幕,適於平板中的分屏模式。

一個fragment必須總是嵌入在一個activity中,同時fragment的生命週期受activity而影響。

fragment添加方式有兩種:

一種是在佈局文件中添加;

<LinearLayout >
...
    <fragment android:name="com.xx.xxFragment"
android:id="@+id/xx_frag"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
...
</LinearLayout>

另一種是在代碼中動態添加,如下面示例。動態添加的好處是易於用新的fragment替換。

1.HomeFragment 

2.PopupActivity: 宿主Activity

3.popup.xml:PopupActivity對應佈局文件

4.popup_home.xml:homeFragment對應佈局文件


popup.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pop"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    <FrameLayout
       android:id="@+id/right_layout"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_toRightOf="@+id/xx">
    </FrameLayout>    

    </LinearLayout>


PopupActivity

public class PopupActivity extends Activity {
	private static final String TAG = "PopupActivity";
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.popup);
		Log.i(TAG, "onCreate()");
		
		//...一些初始化試圖操作
		
		//add fragment
		FragmentTransaction ft = getFragmentManager().beginTransaction();
		mHomeFragment = new HomeFragment();
		ft.add(R.id.right_layout, mHomeFragment, HomeFragment.TAG);
		//ft.addToBackStack(null);	//調用addToBackStack按後退鍵時只消失fragment,否則退出activity
		ft.commit();
	}
        //...
}


HomeFragment

/**
 * 
 * Fragment生命週期 onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onResume()
 * 				onPause() -> onDestroyView() -> onDestroy()
 * 
 * resume時 : onCreateView() -> onActivityCreated() -> onResume()
 */
public class HomeFragment extends BaseFragment{
	public static final String TAG = "HomeFragment";
	
	@Override
	public void onAttach(Activity activity){
		super.onAttach(activity);
		Log.i(TAG, "onAttach():"+activity.getLocalClassName());
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate()");
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, 
	        Bundle savedInstanceState){
		Debug.debug(TAG, "onCreateView()");
		View root = inflater.inflate(R.layout.popup_home, null);
		//...初始化視圖initView(root);
		
		return root;
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState){
		super.onActivityCreated(savedInstanceState);
		Log.i(TAG, "onActivityCreated()");
	}
	
	@Override
	public void onResume(){
		Log.i(TAG, "onResume()");
		super.onResume();
	}
	
	@Override
	public void onPause(){
		Log.i(TAG, "onPause()");
		super.onPause();
	}
	
	@Override
	public void onDestroyView(){
		super.onDestroyView();
		Log.i(TAG, "onDestroyView()");
	}
	@Override
	public void onDestroy(){
		super.onDestroy();
		Log.i(TAG, "onDestroy()");
	}
}


當想用新的fragment替換掉上面HomeFragment顯示時

NewFragment newFragment = new NewFragment();

//傳遞參數

Bundle args = new Bundle();

//args.put數據

newFragment.setArgument(args);

FragmentTransaction ft = activity.getFragmentManager().beginTransaction();

ft.replace(R.id.right_layout, newFragment , "newFragment .TAG");

ft.addToBackStack(null);

ft.commit();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章