android Fragment

Fragment在应用当中应当是一个模块化和可重用的组件,Fragment可以说是对于Activity的一种模块化的抽象。因为Fragment定义了他自己的布局,以及通过使用他自己的生命周期回调方法定义了他自己的行为,一个Fragment可以被多个Activity加载。一个Activity可以加载多个Fragment。


Fragment有自己的生命周期,且在Activity的生命周期里面,会受宿主Activity的生命周期影响
onCreateView()方法返回一个View
Fragment第一次绘制它的用户界面的时候,系统会调用此方法,为了绘制Fragment的UI,此方法必须返回一个View,若不显示UI,返回null即可。



结束当前Fragment返回上一个Fragment
getSupportFragmentManager().popBackStack();//suport.v4包
或getFragmentManager().popBackStack();


生命周期:

Fragment生命周期:
Created【onAttach()->onCreate()->onCreateView()->onActivityCreated()】
onAttach()方法:当Fragment被添加到Activity时会回调这个方法且只调用一次
onCreate()方法:当创建Fragment时会回调这个方法且只调用一次
onCreateView()方法:给Activity绑定一个布局;每次创建都会绘制Fragment的View组件时回调该方法
onActivityCreated()方法:当Fragment所在的Activity启动完成后调用
______________________________________
Started【onStart()】启动Fragment
______________________________________
Resumed【onResume()】恢复Fragment时会被回调,调用onStart()方法后一定会调用onResume()方法
______________________________________
Paused【onPause()】暂停Fragment
______________________________________
Stopped【onStop()】停止Fragment
______________________________________
Destroyed【onDestroyView()->onDestroy()->onDetach()】
onDestroyView()方法:销毁Fragment所包含的View组件时回调
onDestroy()方法:销毁Fragment时会被回调
onDetach()方法:Fragment从Activity中删除时会被回调,且只调用一次


1. 启动Fragment
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
2. 屏幕锁屏
onPause()->onStop()
3. 屏幕解锁
onStart()->onResume()
4. 切换其他Fragment
前一个Fragment:
onPause()->onStop()->onDestoryView()->onDestory()->onDetach()
后一个Fragment:
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
5. 回到桌面
onPause()->onStop()
6. 回到应用
onStart()->onResume()
7. 退出Fragment
onPause()->onStop()->onDestoryView()->onDestory()->onDetach()



加载方式:

一.静态加载 :

1.Activity-->Fragment发送数据:
(1)在Fragment中,定义一个变量X(要传递的值),设置get,set方法
(2)在Activity中,调用FragmentMangaer的findFragmentById(),得到MyFragment,调用变量X的set方法

2.Fragment-->Activity发送数据:

(1)Fragment可调用getActivity()方法获取它所在的Activity
(2)Activity可调用FragmentMangaer的findFragmentById()或findFragmentByTag()方法获取Fratment


二.动态加载:

Activity-->Fragment发送数据:
(1).在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法将数据包传递过去;
(2)在Fragment中调用getARugment()获取数据包


Fragment-->Activity发送数据:
(1).在Fragment中自定义一个接口

(2).在宿主Activity中实现该接口
(3).在Fragment中重写onAttach(Activity activity)

(4).调用按口中的方法,把要发送的数据当参数发送;
(5).在Activity中实现aaa(){}方法


代码如 下 :

主activity


package com.example.myfragment;

import com.example.myfragment.MyFragment.myinterface;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Activity1 extends Activity implements myinterface {

	private TextView tv;
	private Button bt;
	private EditText et;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.xml_activity1);
		tv = (TextView) findViewById(R.id.text);
		bt = (Button) findViewById(R.id.button);
		et = (EditText) findViewById(R.id.edit);

		bt.setText("确认");

		bt.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String ttt = et.getText().toString();
				Log.e("", ttt);
				MyFragment fragment = new MyFragment();// 创建一个fragment对象
				Bundle bundle = new Bundle();
				bundle.putString("name", ttt);
				fragment.setArguments(bundle);

				FragmentManager manager = getFragmentManager();// 获取Fragment管理者
				FragmentTransaction begin = manager.beginTransaction();// 开启一个事务
				begin.add(R.id.layout_2, fragment, "activity..");// 添加一个fragment对象(fragment)到指定的布局中(R.id.layout_2)
				begin.addToBackStack(null);// 设置返回键——返回到fragment前一个状态
				begin.commit();// 把事务提交给Activity

			}
		});

	}

	@Override
	public void aaa(String aaa) {
		tv.setText("我是actibity" + aaa);

	}

}


Fragment 代码:

package com.example.myfragment;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {

	private TextView textF;
	private String aaa = "我是fragment传来的";
	private myinterface lick;
	
	interface myinterface {
		public void aaa (String aaa);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		/**
		* resource:Fragment需要加载的布局文件
		* root:加载layout的父ViewGroup
		* attactToRoot:false,不返回父ViewGroup
		*/
		
		View view = inflater.inflate(R.layout.fragment, container, false);
		textF = (TextView) view.findViewById(R.id.text_f);
		String fff = getArguments().getString("name");
		textF.setText("我是fragment" + fff);
		lick.aaa(aaa);
		return view;
	}

	@Override
	public void onAttach(Activity activity) {
		lick = (myinterface)activity;
		super.onAttach(activity);
	}
}

xml:




    

        
    

    

        

        

java.lang.IllegalStateException: commit already called

该错误,是因为你的ft事务是全局的变量,只能commit一次。

你可能感兴趣的:(android Fragment)