fragment和fragment传参

  由于Activity相对较为笨重,因而在日常的开发中很多时候会用到Fragment。然而Activity之间是通过Intent进行数据的传递,那Fragment是通过什么来进行传递的呢?Fragment之间又是通过什么方式来进行对象的传递呢?

  Android控件之间传递(Activity和Activity间传递对象、Fragment和Fragment间传递对象)对象有两种实现方式。一种是实现Java提供的Serializable接口,另一种是实现android提供的Parcelable接口。两者之间各有优势;实现Serializable接口的话最简单,直接添加接口的实现即可,但是效率较低;实现Parcelable的话效率较高,但需要自己实现Parcelable的方法。下面看下两种方法的具体实现:

  原有Article类

复制代码
package com.example.news.andoridnewsapp;

public class Article {
    private String title;
    private String linkmd5;
    private String link;
    private String desc;

    public String getLinkmd5() {
        return linkmd5;
    }

    public void setLinkmd5(String linkmd5) {
        this.linkmd5 = linkmd5;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getTitle() {

        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
复制代码

  一、实现Serializable,只要在public class Article后面添加接口的实现(implements Serializable)即可

复制代码
package com.example.news.andoridnewsapp;

public class Article implements Serializable {
    private String title;
    private String linkmd5;
    private String link;
    private String desc;

    public String getLinkmd5() {
        return linkmd5;
    }

    public void setLinkmd5(String linkmd5) {
        this.linkmd5 = linkmd5;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getTitle() {

        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
复制代码

  Fragment1进行参数传递

ArticleConententFragment fragment = new ArticleConententFragment();
Bundle args = new Bundle();
args.putSerializable(ARG_ARTICLE, article);

fragment.setArguments(args);

  Fragment2进行参数的接收

(Article) getArguments().getSerializable(ARG_ARTICLE);

  二、实现Parcelable,如果通过Parcelable的方式进行实现的话,需要实现Parcelable接口的方法describeContents(此方法一般不用修改)、writeToParcel(主要是此方法)和创建一个Creator属性。

复制代码
package com.example.news.andoridnewsapp;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

//public class Article implements Serializable {
public class Article implements Parcelable {
    private String title;
    private String linkmd5;
    private String link;
    private String desc;

    public String getLinkmd5() {
        return linkmd5;
    }

    public void setLinkmd5(String linkmd5) {
        this.linkmd5 = linkmd5;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getTitle() {

        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return this.title;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        Bundle bundle = new Bundle();
        bundle.putString("title", getTitle());
        bundle.putString("desc", getDesc());
        bundle.putString("link", getLink());
        bundle.putString("linkmd5", getLinkmd5());
        dest.writeBundle(bundle);
    }

    public static final Creator<Article> CREATOR = new Creator<Article>() {
        @Override
        public Article createFromParcel(Parcel source) {
            Bundle bundle = source.readBundle();
            Article article = new Article();
            article.setTitle(bundle.getString("title"));
            article.setDesc(bundle.getString("desc"));
            article.setLink(bundle.getString("link"));
            article.setLinkmd5(bundle.getString("linkmd5"));
            return article;
        }

        @Override
        public Article[] newArray(int size) {
            return new Article[size];
        }
    };
}
复制代码

  Fragment1进行参数传递

ArticleConententFragment fragment = new ArticleConententFragment();
Bundle args = new Bundle();
//args.putSerializable(ARG_ARTICLE, article);
args.putParcelable(ARG_ARTICLE, article);

fragment.setArguments(args);

  Fragment2进行参数接收

//            mArticle = (Article) getArguments().getSerializable(ARG_ARTICLE);
            mArticle = (Article) getArguments().getParcelable(ARG_ARTICLE);

  这样便可方便地实现对象参数的传递。其实传递的是一个Bundle对象,如果实现的是Serializable接口,则通过Bundle的putSerializable和getSerializable进行设置和获取;如果实现的是Parceable接口,则通过putParceable和getParceable进行设置和获取。

<think>嗯,用户问的是如何在AndroidStudio中实现Fragment之间的参数传递。我需要先回忆一下常见的传参方法,然后根据不同的方法给出示例。首先想到的是使用BundlesetArguments,这是官方推荐的方式,应该放在最前面。然后可能还有通过Activity中转,或者使用EventBus这样的第三方库。需要确保每个方法的步骤清晰,代码示例正确。用户提供的引用中提到了BundleEventBus,所以这两个方法必须包含进去。引用1里的代码示例是获取Bundle参数,可以引用作为例子。引用23提到EventBus,需要简要说明它的用法,但也要注意用户可能需要原生的方法,所以第三方库可以作为补充选项。还要考虑用户可能的后续问题,比如参数类型限制、安全性、优缺点比较。生成相关问题的时候,可以围绕这些点展开,比如性能比较、优缺点、复杂对象传递等。需要确保回答结构清晰,分点说明,每个方法都有步骤代码示例。同时,注意使用中文,LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但这里可能用不上太多数学公式,但如果有提到算法或计算,可能需要正确应用。 检查是否有遗漏的方法,比如ViewModel共享数据,或者接口回调。不过用户的问题集中在Fragment之间的直接传参,可能ViewModel更适合ActivityFragment之间共享数据,而Fragment之间可能需要其他方式。需要明确区分不同的使用场景。最后,确保代码示例正确,比如在创建Fragment实例时使用newInstance模式,设置参数,然后在onCreate中获取。EventBus部分需要说明注册发送事件的步骤,以及依赖添加。可能用户对第三方库的使用不太熟悉,所以需要给出简单的步骤,但也要提醒他们根据项目需求选择。 总结回答结构:分三个主要方法,Bundle、Activity中转、EventBus,每个方法详细步骤代码,然后注意事项相关问题。确保引用正确,比如引用1对应Bundle的例子,引用23对应EventBus。最后生成的相关问题要覆盖不同方法的比较进阶使用。</think>### Android Fragment之间参数传递的三种常用方法 一、**Bundle传参法(官方推荐)** 1. 在发送方Fragment中使用`newInstance()`工厂方法创建接收方Fragment实例 ```java // 接收方Fragment定义 public class TargetFragment extends Fragment { public static TargetFragment newInstance(String param) { TargetFragment fragment = new TargetFragment(); Bundle args = new Bundle(); args.putString("key", param); fragment.setArguments(args); return fragment; } } ``` 2. 在接收方Fragment的`onCreate()`中获取参数 ```java @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { String value = getArguments().getString("key"); } } ``` 3. 在发送方Fragment中启动目标Fragment ```java FragmentTransaction transaction = getParentFragmentManager().beginTransaction(); transaction.replace(R.id.container, TargetFragment.newInstance("传递参数")); transaction.commit(); ``` 这是最安全可靠的参数传递方式[^1] 二、**通过宿主Activity中转** 1. 在宿主Activity中定义公共方法 ```java public class HostActivity extends AppCompatActivity { public void passDataToFragment(String data) { TargetFragment fragment = (TargetFragment) getSupportFragmentManager() .findFragmentById(R.id.target_fragment); if (fragment != null) { fragment.receiveData(data); } } } ``` 2. 在目标Fragment中定义接收方法 ```java public void receiveData(String data) { // 处理接收的数据 } ``` 三、**使用EventBus事件总线(第三方库)** 1. 添加依赖 ```gradle implementation 'org.greenrobot:eventbus:3.3.1' ``` 2. 定义事件类 ```java public class MessageEvent { private String message; public MessageEvent(String message) { this.message = message; } } ``` 3. 发送方发布事件 ```java EventBus.getDefault().post(new MessageEvent("Hello from FragmentA!")); ``` 4. 接收方注册并处理事件 ```java @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { // 处理接收到的消息 } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } ``` 此方法适合复杂场景下的通信[^2][^3] ### 注意事项 1. Bundle传参支持基本类型Parcelable对象 2. 避免直接操作其他Fragment的视图 3. 优先使用官方推荐方式 4. 注意Fragment生命周期状态 5. 复杂数据结构建议实现Parcelable接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值