天天看点

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传递数据。

继续阅读