一、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;
}
}
效果图如下:
未完待续。。。