天天看點

Android:Activity+Fragment及它們之間的資料交換

簡介:

為什麼要用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

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

<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

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

/* 

 * $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:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

        android:text="fragment2" />  

        android:id="@+id/btn1"  

        android:text="直接調用activity" />  

        android:id="@+id/btn2"  

        android:layout_below="@id/btn1"  

        android:text="回調activity" />  

myfragment2.java

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

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);  

回調接口:

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

 * $filename: fragmentcallback.java,v $ 

public interface fragmentcallback {  

    public void callbackfun1(bundle arg);  

    public void callbackfun2(bundle arg);  

main.xml

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

    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

Android:Activity+Fragment及它們之間的資料交換
Android:Activity+Fragment及它們之間的資料交換

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中的方法  

Android:Activity+Fragment及它們之間的資料交換

初始畫面

Android:Activity+Fragment及它們之間的資料交換

切換到第二個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傳遞資料。

繼續閱讀