简介:
为什么要用fragment?使用fragment可以在一个activity中实现不同的界面。fragment与fragment之间的动画切换,远比activity与activity之间的动画切换变化方式多。很多时候,我们通过使用一个activity,切换多个fragment。本次博客,主要列举一下fragment与它的activity之间进行数据交换的方式。
1.fragment中通过getactivity()然后进行强制转化,调用activity中的公有方法
((xxxxactivity)getactivity()).fun();
2.activity在切换fragment的时候,通过setarguments向fragment传递参数,fragment通过getarguments();获得从activity中传递过来的值
3.activity实现一个接口,fragment在onattach方法中,将该activity转化为该接口,在需要调用的时候回调。
注意:本demo是通过fragmentmanager来管理fragment的,通过fragmentmanager管理,我们创建fragment和销毁fragment的时候,可以通过栈的方式:
a.fragmenttransaction的add方法,添加一个fragment
b.fragmenttransaction的popbackstack()弹出该fragment
演示实例:
fragment1.xml
[html] view
plaincopy
<relativelayout 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"
android:background="#ffffffff"
android:paddingbottom="@dimen/activity_vertical_margin"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
tools:context="com.example.testfragment.mainactivity$placeholderfragment" >
<textview
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignparenttop="true"
android:text="fragment1" />
<button
android:id="@+id/btn"
android:layout_below="@id/tv"
android:text="跳转到fragment2" />
</relativelayout>
myfragment1.java
[java] view
/*
* $filename: myfragment.java,v $
* $date: 2014-5-16 $
* copyright (c) zhenghaibo, inc. all rights reserved.
* this software is made by zhenghaibo.
*/
package com.example.testfragment;
import android.app.activity;
import android.os.bundle;
import android.support.v4.app.fragment;
import android.view.layoutinflater;
import android.view.view;
import android.view.view.onclicklistener;
import android.view.viewgroup;
import android.widget.button;
*@author: zhenghaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: [email protected]
*2014-5-16 nanjing,njupt,china
public class myfragment1 extends fragment {
fragmentcallback fragmentcallback = null;
button btn;
@override
public view oncreateview(layoutinflater inflater, viewgroup container,
bundle savedinstancestate) {
view rootview = inflater.inflate(r.layout.fragment1, container,
false);
btn = (button)rootview.findviewbyid(r.id.btn);
btn.setonclicklistener(new onclicklistener() {
@override
public void onclick(view v) {
// todo auto-generated method stub
fragmentcallback.callbackfun1(null);
}
});
return rootview;
}
public void onattach(activity activity) {
// todo auto-generated method stub
super.onattach(activity);
fragmentcallback = (mainactivity)activity;
}
fragment2.xml
android:text="fragment2" />
android:id="@+id/btn1"
android:text="直接调用activity" />
android:id="@+id/btn2"
android:layout_below="@id/btn1"
android:text="回调activity" />
myfragment2.java
import android.widget.toast;
public class myfragment2 extends fragment {
button btn1;
button btn2;
view rootview = inflater.inflate(r.layout.fragment2, container,
bundle data = getarguments();//获得从activity中传递过来的值
toast.maketext(getactivity(), data.getstring("text"), toast.length_short).show();
btn1 = (button)rootview.findviewbyid(r.id.btn1);
btn1.setonclicklistener(new onclicklistener() {
// 直接调用activity中的方法
((mainactivity)getactivity()).changebuttoncolor();
btn2 = (button)rootview.findviewbyid(r.id.btn2);
btn2.setonclicklistener(new onclicklistener() {
// 回调的方式
fragmentcallback.callbackfun2(null);
回调接口:
* $filename: fragmentcallback.java,v $
public interface fragmentcallback {
public void callbackfun1(bundle arg);
public void callbackfun2(bundle arg);
main.xml
android:paddingtop="@dimen/activity_vertical_margin" >
android:layout_width="match_parent"
android:layout_alignparentbottom="true"
android:text="切换" />
<relativelayout
android:id="@+id/rl_container"
android:layout_above="@id/btn" />
mainactivity.java
import android.graphics.color;
import android.support.v4.app.fragmentmanager;
import android.support.v4.app.fragmenttransaction;
import android.support.v7.app.actionbaractivity;
public class mainactivity extends actionbaractivity implements fragmentcallback{
private button btn;
private myfragment1 fragment1;
private myfragment2 fragment2;
private fragmentmanager fragmentmanager;
private fragment currentfragment;
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
fragmentmanager = getsupportfragmentmanager();
fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction();
fragmenttransaction.setcustomanimations(android.r.anim.fade_in, android.r.anim.fade_out);
fragment1 = new myfragment1();
bundle data = new bundle();
data.putstring("text", "这是activiy通过bundle传递过来的值");
fragment1.setarguments(data);//通过bundle向activity中传递值
fragmenttransaction.add(r.id.rl_container,fragment1);//将fragment1设置到布局上
fragmenttransaction.addtobackstack(null);
fragmenttransaction.commitallowingstateloss();
currentfragment = fragment1;
//初始化button控件
btn = (button)findviewbyid(r.id.btn);
if(currentfragment instanceof myfragment1){
switchfragment();
}else{//当前是fragment2,因此,只需要将fragment2出栈即可变成fragment1
fragmentmanager.popbackstack();
currentfragment = fragment1;
}
/**
* 切换fragment
*/
private void switchfragment(){
if(null == fragment2){//可以避免切换的时候重复创建
fragment2 = new myfragment2();
}
data.putstring("text", "传递给fragment2");
fragment2.setarguments(data);
fragmenttransaction.add(r.id.rl_container,fragment2);
currentfragment = fragment2;
public void changebuttoncolor(){
btn.setbackgroundcolor(color.red);
public void callbackfun1(bundle arg) {
switchfragment();//通过回调方式切换
public void callbackfun2(bundle arg) {
changebuttoncolor();//通过回调方式调用activity中的方法
初始画面
切换到第二个fragment之后,通过fragment2回调,改变按钮背景后的截图。
注意:
1.直接在fragment中通过getactivity然后强转activity的方式调用activity的方法,这个方式不推荐!因为这会使fragment的适配性变差。
解决方法:在使用之前,使用instanceof 判断一下activity的类型
2.fragmenttransaction通过使用setcustomanimations方法,可以为fragment的切换增添各种不同的动画。变化方式远比activity与activity之间的切换动画要多。
3.多个fragment之间,可以通过activity复用很多代码,提高效率。
4.我们还可以通过viewpager来管理fragment,通过adapter添加多个fragment,然后通过setcurrentitem进行切换。我们同样可以通过setarguments向fragment传递数据。