继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【原创】Android中Activity和Fragment通信

去吧皮卡丘
关注TA
已关注
手记 5
粉丝 34
获赞 749

活动(Activity)和碎片(Fragment)在Android开发中占着非常重要的作用,每一个开发者想要开发出丰富多彩的Android项目,那就必须要好好了解这两位小伙伴才行。那么接下来,就让皮卡丘带着大家围观下这两位小伙伴的“搞基”之旅吧。

1、Activity使用Fragment中的方法
这个是比较简单的,首先,因为一般情况下Fragment是依附于Activity的,所以在Activity中可以先获取到Fragment的实例,然后就可以直接调用Fragment中的方法了。我们用代码来验证一下,先建一个MyFragment的类,然后在MyFragment中写一个方法:

public void toastShow() {
        Log.i("MyFragment", "去吧皮卡丘");
    }

然后在activity中创建MyFragment实例对象,并且调用toastShow()方法:

fragment = new MyFragment();
fragment.toastShow();

OK,执行代码,查看日志
图片描述
方法执行成功!!!可喜可贺可喜可贺

2、Fragment使用Activity中的方法
所谓好基友,当然不会只是Activity使用Fragment的方法。在Fragment中也可以以类似的途径使用Activity的方法:先以getActivity的方式获取到Activity,然后就可以使用方法了(毕竟好基友,相互赠送礼物的方式比较像也是可以理解的嘛)。但是,这里有一个非常重要的东西要理解,那就是:Fragment中getActivity()获取到的对象不能直接用,必须要类型强转!!!(MainActivity)getActivity()这样才可以!

我们在MainActivity中写一个方法

public String getTestString() {
        return "成功执行activity中的方法";
    }

然后在MyFragment中调用他

case R.id.button1:
            String text1 = ((MainActivity)getActivity()).getTestString();
            tv_test.setText(text1);
            break;

我们打开模拟器,来看看效果
点击之前
图片描述
点击之后
图片描述
方法执行成功!!!可喜可贺可喜可贺

3、Activity响应Fragment中的点击事件
终于到了最激动人心,最基情满满的功能了。
我们试想下这样一种场景:在一个Fragment里面按下一个按钮,然后Activity中根据Fragment中传递过来的参数执行相应的方法。这样的场景其实是非常实用的,我们可以通过接口的方式来实现这样的功能。我们在MyFragment中定义这样的接口

    public interface OnButton2ClickListener {
        public void OnButton2ClickListener(String showText);
    }

@Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        try {
            mListener = (OnButton2ClickListener) activity;
        } catch (Exception e) {
            // TODO: handle exception
            throw new ClassCastException(activity.toString() + "must implement OnButton2ClickListener");
        }
    }

如果MainActivity没有实现这个接口,MyFragment就会抛出ClassCastException,如果成功了,那么MyFragment就可以调用mListener的方法来与MainActivity共享事件。
OK,那我们接着在MyFragment中添加代码:

case R.id.button2:
            String showText = "去吧小火龙";
            mListener.OnButton2ClickListener(showText);
            break;

然后在MainActivity中实现接口OnButton2ClickListener

public class MainActivity extends Activity implements OnClickListener, 
        OnButton2ClickListener {

    ......
    @Override
    public void OnButton2ClickListener(String showText) {
        // TODO Auto-generated method stub
        TextView tv_activity = (TextView) findViewById(R.id.tv_activity);
        tv_activity.setText(showText);
    }
    ......
}

我们快点打开模拟器来查看Activity和Fragment“爱的结晶”吧
初始界面
图片描述
点击MyFragment中的“接口方式”按钮之后
图片描述
大家看到了吗?屏幕最下面的文字变成了“去吧皮卡丘”,说明Activity的确响应了Fragment中的点击事件,可喜可贺可喜可贺~~~


接下来贴出本项目所有的代码,皮卡丘写了非常详细的注解,相信就算是新手小伙伴们也能很快理解。

因为Fragment存在版本兼容性问题,所以建议将AndroidManifest.xml中的minSdkVersion设置成android:minSdkVersion="11"
类文件
MainActivity:

package com.example.fragment;

import com.example.fragment.MyFragment.OnButton2ClickListener;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;

public class MainActivity extends Activity implements OnClickListener, 
        OnButton2ClickListener {

    private Button btn1, btn2;

    MyFragment fragment;

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

        initView();

     // 创建MyFragment对象
        fragment = new MyFragment();
    }

    private void initView() {
        // TODO Auto-generated method stub
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    private void getFragment() {
        // TODO Auto-generated method stub

        // FragmentManager可以用来管理Activity中的fragment,在Android 3.0(即API 11)时引入,所
        // 以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法
        FragmentManager fragmentManager = getFragmentManager();

        // FragmentTransaction 每一个事务都是同时要执行的一套变化,必须调用commit()才能生效
        FragmentTransaction beginTransaction = fragmentManager.beginTransaction();

        // 再添加之前先移除之前的fragment
        beginTransaction.remove(fragment);

        // 在beginTransaction事务中加入add动作
        beginTransaction.add(R.id.fragment_ll, fragment);

        // 如果添加这一行代码,那么用户按下back时会返回前一个fragment状态
        beginTransaction.addToBackStack(null);

        // 执行事务
        beginTransaction.commit();
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.btn1:
            getFragment();
            break;
        case R.id.btn2:
            fragment.toastShow();
            break;
        default:
            break;
        }
    }

    // Activity中的方法,提供给Fragment调用
    public String getTestString() {
        return "成功执行activity中的方法";
    }

    // 实现Fragment中的接口
    @Override
    public void OnButton2ClickListener(String showText) {
        // TODO Auto-generated method stub
        TextView tv_activity = (TextView) findViewById(R.id.tv_activity);
        tv_activity.setText(showText);
    }
}

MyFragment:

package com.example.fragment;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MyFragment extends Fragment implements OnClickListener {
    OnButton2ClickListener mListener;
    private Button button1;
    private Button button2;
    private TextView tv_test;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment, container, false);
        button1 = (Button) view.findViewById(R.id.button1);
        button2 = (Button) view.findViewById(R.id.button2);
        tv_test = (TextView) view.findViewById(R.id.tv_test);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        return view;
    }

    // Fragment中的方法,供Activity调用
    public void toastShow() {
        Log.i("MyFragment", "去吧皮卡丘");
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.button1:
            // 调用Activity中的方法
            String text1 = ((MainActivity)getActivity()).getTestString();
            tv_test.setText(text1);
            break;
        case R.id.button2:
            // fragment和activity共享点击事件
            String showText = "去吧皮卡丘";
            mListener.OnButton2ClickListener(showText);
            break;
        default:
            break;
        }
    }

    // 定义接口
    public interface OnButton2ClickListener {
        public void OnButton2ClickListener(String showText);
    }

    // 如果MainActivity没有实现这个接口,MyFragment就会
    // 抛出ClassCastException,如果成功了,那么MyFragment就
    // 可以调用mListener的方法来与MainActivity共享事件。
    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        try {
            mListener = (OnButton2ClickListener) activity;
        } catch (Exception e) {
            // TODO: handle exception
            throw new ClassCastException(activity.toString() + "must implement OnButton2ClickListener");
        }
    }
}

布局文件
activity_main.xml

<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: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=".MainActivity" >

    <LinearLayout 
        android:id="@+id/ll_bottomBtn"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        >

        <Button 
            android:id="@+id/btn1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="跳转到Fragment"
            />

        <Button 
            android:id="@+id/btn2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Activity使用Fragment的方法"
            />

        <TextView 
            android:id="@+id/tv_activity"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Activity"
            android:gravity="center"
            />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/fragment_ll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/ll_bottomBtn"
        android:orientation="vertical"
        android:background="#A0A0A0"
        ></LinearLayout>

</RelativeLayout>

fragment.xml

<?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" >

    <TextView 
        android:id="@+id/tv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment"
        android:layout_centerInParent="true"
        android:textSize="20sp"
        />

    <Button 
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="getActivity()方式"
        android:layout_below="@id/tv_test"
        android:layout_centerHorizontal="true"
        />

    <Button 
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/button1"
        android:text="接口方式"
        />

</RelativeLayout>
打开App,阅读手记
22人推荐
发表评论
随时随地看视频慕课网APP

热门评论

皮卡皮卡 皮卡丘(๑´•ω•) 感谢

可喜可贺可喜可贺可喜可贺可喜可贺。。。。

皮卡皮卡 皮卡丘(๑´•ω•)

查看全部评论