Android之Fragment

4 篇文章 0 订阅
3 篇文章 0 订阅

一、Fragment的创建(两种)

1.静态方法:即使用布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="#fff">>

    <TextView 
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="firstFragment"/>
</LinearLayout>
对应的Fragment类

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @description: <fragment/>中的name属性指定了layout(这里是指activity_main)中实例化的Fragment类.
 *               当系统创建activity_main时
 *               ,它实例化每一个layout中指定的fragment,并调用他们的oncreateView
 *               (),来获取每一个Fragment对应的layout
 *               ,系统将Fragment返回的view直接插入到<fragment>元素所在的地方
 * 
 * @author taoZhang
 * @created 2015-11-30 下午11:51:43
 * 
 */
@SuppressLint("NewApi") 
public class FirstFragment extends Fragment{
	/**
	 * 添加Fragment的布局文件,并返回The root View of the inflated hierarchy
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.activity_first, container, false);
		return view;
	}
}
主布局文件中如下(此行由于编辑问题,可忽略):
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <!-- id必须要有,name表示引用的Fragment类
     	布局文件相当于静态,代码是动态
      -->
    <fragment 
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/fragment1"
        android:name="com.example.fragment.FirstFragment"/>
    
    <fragment 
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/fragment2"
        android:name="com.example.fragment.SecondFragment"/>
     
</LinearLayout>
 

2.动态加载:即在代码中加载Fragment

首先,在主布局文件中加上frameLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <!-- id必须要有,name表示引用的Fragment类
     	布局文件相当于静态,代码是动态
      -->
    <fragment 
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/fragment1"
        android:name="com.example.fragment.FirstFragment"/>
    
    <fragment 
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/fragment2"
        android:name="com.example.fragment.SecondFragment"/>
    
    <!-- 作为一个容器加载Fragment,因此必须要有id来获取这个容器 -->
    <FrameLayout 
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/frameLayout"></FrameLayout>
    
</LinearLayout>
同样的,也需要对应的一个Fragment类,用来获取对应的布局文件activity_third

这是activity_third:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/hello_world"/>
</LinearLayout>
最后,在MainActivity中利用FragmentManager来添加Fragment

FragmentManager fragmentManager = getFragmentManager();// 获取事务
		FragmentTransaction transaction = fragmentManager.beginTransaction();//开启事务
		//设置事务的操作
		ThirdFragment fragment = new ThirdFragment();
		transaction.add(R.id.frameLayout, fragment);//将Fragment添加到帧布局中
		//commit
		transaction.commit();
二、Fragment的参数传递

stackoverflow类似问题:Avoid non-default constructors in fragments: use a default constructor  plus Fragment#setArgument

首先阅读官方api可知,可以通过constructor来传递参数,即重载构造方法。需要一定的注释,不然会报错

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead

再加上,横竖屏切换后,activity会重新加载,依附于它的Fragment肯定会重新加载,上面的文字等也会重新加载。为了节约资源,要将Fragment这个对象设置成静态的.。

那就只能利用单例模式来传参了,不多说,上代码

这是ThirdActivity:

package com.example.fragment;

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

/**
 * @description: 横竖屏切换后,activity会重新加载,依附于它的Fragment肯定会重新加载,上面的文字等也会重新加载
 *               为了节约资源,要将Fragment这个对象设置成静态的.
 *               向Fragment中pass
 *               Arguments,由于使用构造方法每次new一个,会加重内存负担,
 *               只能使用单例模式通过bundle传参.
 * 
 * @author taoZhang
 * @created 2015-11-30 下午11:23:44
 * 
 */
@SuppressLint("NewApi")
public class ThirdFragment extends Fragment {
	
	private static ThirdFragment fragment = null;//注意static是最后回收的
	
	public ThirdFragment() {
		super();
	}
	
//	Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
//	public ThirdFragment(String str) {
//		super();
//		this.title = title;
//	}

	/**
	 * 获取Fragment对应的布局文件
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.activity_third, container, false);//fragment的布局文件
		TextView textView = (TextView) view.findViewById(R.id.textView3);
		String content = getArguments().getString("content");//获取参数
		textView.setText(content);
		return view;
	}
	
	/**
	 * 单例模式,获取对象,除了构造方法之外传参,就要使用bundle
	 * @param str 要传入的参数
	 * @return	fragment对象
	 */
	public static ThirdFragment getInstance(String str){
		if(fragment==null){
			System.out.println("---------fragment为空------"+fragment);
			fragment = new ThirdFragment();
			System.out.println("---------创建完Fragment------"+fragment);
		}
		//传参
		Bundle bundle = new Bundle();
		bundle.putString("content", str);
		fragment.setArguments(bundle);//将bundle作为参数绑定到fragment
		return fragment;
	}
}
此时,Mainactivity要做小小的修改

package com.example.fragment;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.view.Menu;

/**
 * @description: Fragment的创建,
 * 事务可以保持一致性,有一步出错就会自动回退
 * 
 * @author taoZhang
 * @created 2015-11-30 下午11:50:27
 * 
 */
public class MainActivity extends Activity {

	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// **********动态的获取Fragment*********
		// 在帧布局中加载fragment
		FragmentManager fragmentManager = getFragmentManager();// 获取事务
		FragmentTransaction transaction = fragmentManager.beginTransaction();//开启事务
		//设置事务的操作
//		ThirdFragment fragment = new ThirdFragment();
		ThirdFragment fragment = ThirdFragment.getInstance("参数传递成功");
		transaction.add(R.id.frameLayout, fragment);//将Fragment添加到帧布局中
		//commit
		transaction.commit();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

效果图如下:


未完待续。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值