簡介:
為什麼要用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傳遞資料。