android (13) Fragment使用下

一.Fragment使用:

要在你的activity中管理Fragment,需要使用FragmentManager,可以通过getFragmentManager(),这里注意要是在v4包要用getSupportFragmentManager()方法。

FragmentManager可以开一个事物调用beginTransaction()方法返回FragmentTransaction对象,这是我们可以用FragmentTransaction去执行删除增加Fragment的一些操作:

(1).add():往activity添加一个Fragment。

(2).remove():从Activity移除一个Fragment,当这个Fragment没有添加进回退栈,则会被销毁。当添加进入回退栈之后则会销毁视图层,在显示这个Fragment则会调用onDestoryView和onCreateView。

(3).replace():使用另一个Fragment替换当前的Fragment,也就是remove操作和add合体执行。

(4).hide():隐藏当前的Fragment,仅仅是设为不可见,并不会销毁。

(5).show():显示之前隐藏的Fragment。

(6).detach():会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

(7).attach():重建view视图,附加到UI上并显示。

(8).addToBackStack():添加Fragment事务到回退栈中。传null表示当前Fragment。

(9).commit():提交事务。

注意当以使用了add添加Fragment之后,你仅仅是想隐藏Fragment,而且保持当前Fragment输入的数据,你只需要用hide(),如果你不想用户在看到数据,直接使用replace()比使用add()在remove()方便的多。

二.如何使用回退栈保持数据:

实现效果,当进入第一个Fragment后点击改变文字按钮,会把显示在屏幕中央的TextView内容改变,然后点击进入第二个Fragment,在点击返回按钮,屏幕中央的TextView内容会还原成未改变前的,这就是说明了退回栈把Fragment的视图销毁了,但是实例并没有销毁,如果你想要不把数据也销毁,则就像上面说的使用hide()和show().

图片就不上传了,大家可是自行测试源码(要源码留下邮箱,这个是在上篇文章基础上修改的):

主Activity:

public class MainActivity extends Activity  {
	RelativeLayout r1;
	RelativeLayout r2;
	RelativeLayout r3;
	RelativeLayout view = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.bottom_layout);

		r1 = (RelativeLayout) findViewById(R.id.layout1);
		r2 = (RelativeLayout) findViewById(R.id.layout2);
		r3 = (RelativeLayout) findViewById(R.id.layout3);

		setDefaultFragment();
	}
	private void setDefaultFragment() {
		FragmentManager fm = getFragmentManager();
		FragmentTransaction transaction = fm.beginTransaction();
		MyFragment my = new MyFragment();
		transaction.add(R.id.frame_layout1, my,"ONE");
		transaction.addToBackStack(null);
		transaction.commit();
	}

}

Fragment1:

public class MyFragment extends Fragment implements OnClickListener {

	private Button button1;
	private Button button2;
	private TextView textView1;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println("onCreateView");
		View view = inflater.inflate(R.layout.fragment_1, container, false);
		button1 = (Button) view.findViewById(R.id.button1);
		button1.setOnClickListener(this);
		button2 = (Button) view.findViewById(R.id.button2);
		button2.setOnClickListener(this);
		textView1 = (TextView) view.findViewById(R.id.textView1);
		return view;
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.button1:
			textView1.append("哈");
			break;
		case R.id.button2:
			MyFragment2 f2 = new MyFragment2();
			FragmentManager fm = getFragmentManager();
			FragmentTransaction tx = fm.beginTransaction();
			tx.replace(R.id.frame_layout1, f2, "TWO");
			tx.addToBackStack(null);
			tx.commit();
			break;
		}
	}

}

Fragment2:

public class MyFragment2 extends Fragment implements OnClickListener {
	private Button button1;
	private Button button2;
	private TextView textView1;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println("onCreateView");
		View view = inflater.inflate(R.layout.fragment_2, container, false);
		button1 = (Button) view.findViewById(R.id.button11);
		button1.setOnClickListener(this);
		button2 = (Button) view.findViewById(R.id.button21);
		button2.setOnClickListener(this);
		textView1 = (TextView) view.findViewById(R.id.textView2);
		return view;
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.button11:
			textView1.append("哈");
			break;
		case R.id.button21:
			MyFragment3 f3 = new MyFragment3();
			FragmentManager fm = getFragmentManager();
			FragmentTransaction tx = fm.beginTransaction();
			tx.hide(this);
			tx.add(R.id.frame_layout1, f3, "THREE");
	// tx.replace(R.id.id_content, fThree, "THREE");
			tx.addToBackStack(null);
			tx.commit();
			break;
		}
	}

}

Fragment1布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="第一个页面" />

       <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:text="改变文字" />

    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_below="@id/button1"
        android:text="跳转第二个界面" />

</RelativeLayout>

Fragment3:

public class MyFragment3 extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    		Bundle savedInstanceState) {
    	return inflater.inflate(R.layout.fragment_3, container, false);
    }
}

这样就ok了。

三.Activity与Fragment之间的回调:

因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。

就用上边的例子,第一种回调:

public class MyFragment extends Fragment implements OnClickListener {

	private Button button1;
	private Button button2;
	private TextView textView1;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println("onCreateView");
		View view = inflater.inflate(R.layout.fragment_1, container, false);
		button1 = (Button) view.findViewById(R.id.button1);
		button1.setOnClickListener(this);
		button2 = (Button) view.findViewById(R.id.button2);
		button2.setOnClickListener(this);
		textView1 = (TextView) view.findViewById(R.id.textView1);
		return view;
	}

	public interface MyFragmentOneClick{
		void onMyOneBtnClick();
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.button1:
			textView1.append("哈");
			break;
		case R.id.button2:
			//第一种回调方式
			if (getActivity() instanceof MyFragmentOneClick)
	        {
	            ((MyFragmentOneClick) getActivity()).onMyOneBtnClick();
	        }
			break;
		}
	}

}

第二种回调:

public class MyFragment2 extends Fragment implements OnClickListener {
	private Button button1;
	private Button button2;
	private TextView textView1;
	private MyFragmentTwoClick myFragmentTwoClick ;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println("onCreateView");
		View view = inflater.inflate(R.layout.fragment_2, container, false);
		button1 = (Button) view.findViewById(R.id.button11);
		button1.setOnClickListener(this);
		button2 = (Button) view.findViewById(R.id.button21);
		button2.setOnClickListener(this);
		textView1 = (TextView) view.findViewById(R.id.textView2);
		return view;
	}

	public interface MyFragmentTwoClick{
		void onMyTwoBtnClick();
	}

	//第二种回调方式,设置回调接口
    public void setMyTwoBtnClickListener(MyFragmentTwoClick myFragmentTwoClick)
    {
        this.myFragmentTwoClick = myFragmentTwoClick;
    }
	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.button11:
			textView1.append("哈");
			break;
		case R.id.button21:
			if(myFragmentTwoClick != null)
	        {
				myFragmentTwoClick.onMyTwoBtnClick();
	        }
			break;
		}
	}

}

主Activity实现:

public class MainActivity extends Activity implements MyFragmentOneClick,MyFragmentTwoClick {
	RelativeLayout r1;
	RelativeLayout r2;
	RelativeLayout r3;
	RelativeLayout view = null;
	MyFragment f1;
	MyFragment2 f2 ;
	MyFragment3 f3;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.bottom_layout);

		r1 = (RelativeLayout) findViewById(R.id.layout1);
		r2 = (RelativeLayout) findViewById(R.id.layout2);
		r3 = (RelativeLayout) findViewById(R.id.layout3);

		setDefaultFragment();
	}
	private void setDefaultFragment() {
		FragmentManager fm = getFragmentManager();
		FragmentTransaction transaction = fm.beginTransaction();
		f1 = new MyFragment();
		transaction.add(R.id.frame_layout1, f1,"ONE");
		transaction.addToBackStack(null);
		transaction.commit();
	}

	@Override
	public void onMyOneBtnClick() {

		if (f2 == null)
        {
			f2 = new MyFragment2();
			f2.setMyTwoBtnClickListener(this);
        }
		FragmentManager fm = getFragmentManager();
		FragmentTransaction tx = fm.beginTransaction();
		tx.replace(R.id.frame_layout1, f2, "TWO");
		tx.addToBackStack(null);
		tx.commit();
	}
	@Override
	public void onMyTwoBtnClick() {
		if (f3 == null)
        {
			f3 = new MyFragment3();  

        }
		FragmentManager fm = getFragmentManager();
		FragmentTransaction tx = fm.beginTransaction();
		tx.hide(f2);
		tx.add(R.id.frame_layout1, f3, "THREE");
		tx.addToBackStack(null);
		tx.commit();
	}

}

这样也实现了上述的功能。

时间: 2024-07-29 09:37:29

android (13) Fragment使用下的相关文章

Android之Fragment用法

本文翻译自Android developer网站上面,原文参考:Building a Dynamic UI with Fragments 当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类.Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期. 多个Fragm

android之Fragment基础详解(一)

一.Fragment的设计哲学 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互. 针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的.难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊.Fragment的出现就是为了解决这样的问题.你可以把Frag

Android中Fragment和ViewPager那点事儿

在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragment与Activity之间的交互(两种实现方式)>中我们介绍了ViewPager以及Fragment各自的使用场景以及不同的实现方式. 那如果将他们两结合起来,会不会擦出点火花呢,答案是肯定的.之前在介绍ViewPager时,我们实现了多个ImageView的切换,并配合更新导航原点的状态.那我们现在

Android中Fragment与Activity之间的交互(两种实现方式)

(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如何创建Fragment混合布局做了详细的分析,今天就来详细说道说道Fragment与宿主Activity之间是如何实现数据交互的. 我们可以这样理解,宿主Activity中的Fragment之间要实现信息交互,就必须通过宿主Activity,Fragment之间是不可能直接实现信息交互的. Fragment与

ANDROID中FRAGMENT的两种创建方式

fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入事件,并且可以在Activity运行时添加或者删除. 两个概念:Fragment.宿主 fragment的生命周期直接受其宿主activity的生命周期的影响.例如,一旦activity被暂停,它里面所有的fra

android与fragment交互,fragment显示unity3d视图。

这两天刚刚接触Unity3d,之前一直是做android开发,对于Unity3d的开发有专门的人才,我主要涉及在Unity3d与android的交互,经过两天是实验终于完成了下面的效果: 本来想写几篇博客,来详细说明下Unity3d导出android Project然后再进行二次开发的过程,后来发现几篇博客,过程和我的类似,对于重复的过程我就不写了,大家参考他的博客就可以了.而且,包括了Unity3d调用android脚本,这一块我暂时还没有涉及. Unity3D游戏开发之Unity与Andro

android之Fragment(官网资料翻译)

Fragment要点 Fragment作为Activity界面的一部分组成出现 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用. 在Activity运行过程中,可以添加.移除或者替换Fragment(add().remove().replace()) Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接被其所属的宿主activity的生命周期影响. 设计哲学 Android在3.0中引入了fr

android 63 Fragment

#Fragment 是3.0平板才引入进来的,3.0之后就加入了Fragment.原来是一个屏幕就是一个Activity,>片段,碎片 1. 定义某一个片段的界面 继承Fragment类 public class BlueToothFragment extends Fragment {} 2. 重写Fragment里面的方法 显示Fragment的ui,把布局文件转化成view对象 public View onCreateView(LayoutInflater inflater, ViewGro

[转]Android:Activity+Fragment及它们之间的数据交换(一)

2014-05-18         来源:Android:Activity+Fragment及它们之间的数据交换(一)   简介: 为什么要用Fragment?使用Fragment可以在一个Activity中实现不同的界面.Fragment与 Fragment之间的动画切换,远比Activity与Activity之间的动画切换变化方式多.很多时候,我们通过使用一个Activity,切换 多个Fragment.本次博客,主要列举一下Fragment与它的Activity之间进行数据交换的方式.

Android碎片Fragment总结

一.Fragment的相关概念 (一)Fragment的基础知识 Fragment是Android3.0新增的概念,中文意思是碎片,它与Activity十分相似,用来在一个 Activity中描述一些行为或一部分用户界面.使用多个Fragment可以在一个单独的Activity中建 立多个UI面板,也可以在多个Activity中使用Fragment. Fragment拥有自己的生命 周期和接收.处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了.更为 重要的是,你可以动态的