Fragment学习

Android在3.0版本引入了Fragment(碎片)功能,android 4.0 后平板手机混用.用途在一个Activity里切换界面,切换界面时只切换Fragment里面的内容.生命周期方法跟Activity一致,可以理解把其为就是一个Activity.低版本要想使用fragment 请导入v4包.在support-v4.jar包中有相关api.

一.定义第一个Fragment

1.首先定义一个res/layout/下定义一个布局fragment1. xml文件,这个文件作为Fragment的显示内容
2.定义一个java类 Fragment1继承Fragment类,重写onCreateView方法.加载刚才新建的布局文件
   
		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
			//用布局文件填充成一个View对象,返回出去,那么就显示在Fragment上了
			View v = inflater.inflate(R.layout.fragment01, null);
			return v;     
		}
3.把该页面加入要main_layout.xml文件中去
<fragment  
        android:id="@+id/fragment1"  
        android:name="com.example.fragmentdemo.Fragment1"  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" /> 


二.Fragment的生命周期

fragment切换时旧fragment对象会销毁(pause(),stop(),destroy()方法会被调用),新的fragment对象会被创建.fragment的生命周期跟activity绑定在一起。 fragment的生命周期跟activity很像,这里只列出一些不一样,如下:
  • onAttach方法:Fragment和Activity建立关联的时候调用。
  • onCreateView方法:为Fragment加载布局时调用。
  • onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
  • onDestroyView方法:Fragment中的布局被移除时调用。
  • onDetach方法:Fragment和Activity解除关联的时候调用。

三.动态加载Fragment,将Fragment显示至指定ViewGroup中

1.主页面布局文件如下:
<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"
    tools:context=".MainActivity" 
    android:orientation="horizontal"
    >

   
	<FrameLayout 
	    android:id="@+id/fl"
	    android:layout_weight="1"
	    android:layout_width="0dp"
	    android:layout_height="match_parent"
	    ></FrameLayout>
	
	 <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment01"
            android:onClick="click1"
            />
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment02"
            android:onClick="click2"
            />
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment03"
            android:onClick="click3"
            />
    </LinearLayout>
</LinearLayout>
2.主页面代码如下,这里让动态替换帧布局里面的内容,注意主页面的类要继承FragmentActivity,不是继承Activity类.
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        fg3 = new Fragment03();
    	//获取fragment管理器
    	FragmentManager fm = getSupportFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示至帧布局
    	ft.replace(R.id.fl, fg3);
    	//提交
    	ft.commit();
    }
   public void click1(View v){
    	//把fragment01的界面显示至帧布局中
    	//创建fragment对象
    	Fragment01 fg1 = new Fragment01();
    	//获取fragment管理器
    	FragmentManager fm = getSupportFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示至帧布局
    	ft.replace(R.id.fl, fg1);
    	//提交
    	ft.commit();
    }
其他按钮类似,这里不再列出.

四 Fragment与主页面互操作

1.在fragment操作主activity控件,通过getActivity方法,获取到宿主activity,可以通过在宿主activity中定义一系列公开的方法操作主页面的activity.
public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View v = inflater.inflate(R.layout.fragment01, null);
		
		final EditText et = (EditText) v.findViewById(R.id.et);
		Button bt = (Button) v.findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String text = et.getText().toString();
				//把数据传递给activity
				((MainActivity)getActivity()).setText(text);
				
			}
		});
		return v;
	}
2.主页面操作fragment,跟上面操作的步骤类似,可以在fragment中定义操作的fragment Ui的公开方法,在每次调用时,调用每个fragment中的方法.
  public void click4(View v){
    	String text = et_main.getText().toString();
        Fragment02 fg2 = new Fragment02();
    	//传递数据
    	fg2 .setText(text);
    }
    











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值