You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Activity向Page Adapter传数据并分发至多个Fragment?

如何从Activity向ViewPager的PagerAdapter传递数据并分发给多个Fragment

我需要将字符串数据传递到TabLayout中,已实现从Adapter向TabLayout内的Fragment传数据,但无法从Activity向Page Adapter类传递数据,需将数据传递给多个Fragment,请问该如何实现?

主Activity代码

package com.example.tablay;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;

import com.google.android.material.tabs.TabLayout;

import java.util.List;
import java.util.Stack;

public class MainActivity extends AppCompatActivity {

    private ViewPager pager;
    private TabLayout tabs;

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

        pager=(ViewPager) findViewById(R.id.pager);
        tabs=(TabLayout) findViewById(R.id.tabs);


        pager.setAdapter(new TabFragmentPagerAdapter(getSupportFragmentManager()));
        tabs.setupWithViewPager(pager);
        tabs.setTabGravity(TabLayout.GRAVITY_FILL);

        
    }

}

PagerAdapter代码

package com.example.tablay;

import android.os.Bundle;
import android.provider.ContactsContract;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import java.util.Date;
import java.util.List;


public class TabFragmentPagerAdapter extends FragmentPagerAdapter {
    String[] title = new String[]{
            "Tab 1", "Tab 2", "Tab 3"
    };

    public TabFragmentPagerAdapter(@NonNull FragmentManager fm) {
        super(fm);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        Fragment fragment=null;
        switch (position){
            case 0:
                tab1Fragment tab1Fragment=new tab1Fragment();
                Bundle bundle = new Bundle();
                bundle.putString("edttext", "data From Activity");
                tab1Fragment.setArguments(bundle);
                return tab1Fragment;
            case 1:
                tab2Fragment tab2Fragment=new tab2Fragment();
                bundle = new Bundle();
                bundle.putString("edttext1", "data From Activity1");
                tab2Fragment.setArguments(bundle);
                return tab2Fragment;
            case 2:
                tab3Fragment tab3Fragment=new tab3Fragment();
                return tab3Fragment;
            default:
                fragment=null;
                break;
        }
        return  fragment;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return  title[position];
    }

    @Override
    public int getCount() {
        return  title.length;
    }
}

Fragment代码(以tab1Fragment为例)

package com.example.tablay;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class tab1Fragment extends Fragment {


    public tab1Fragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_tab1, container, false);
        TextView tes=(TextView) view.findViewById(R.id.testtab1);
        String strtext = getArguments().getString("edttext");

        tes.setText(strtext);
        return  view;
    }
}

解决方案

要实现从Activity向PagerAdapter传数据并分发给Fragment,只需修改PagerAdapter的构造方法,让它能接收来自Activity的数据,之后在创建Fragment时把数据传递过去即可:

  1. 修改PagerAdapter,添加数据接收逻辑
    在TabFragmentPagerAdapter中添加成员变量存储需要传递的数据,并重写构造方法接收Activity传入的数据:

    package com.example.tablay;
    
    import android.os.Bundle;
    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentManager;
    import androidx.fragment.app.FragmentPagerAdapter;
    
    public class TabFragmentPagerAdapter extends FragmentPagerAdapter {
        String[] title = new String[]{"Tab 1", "Tab 2", "Tab 3"};
        // 添加成员变量存储从Activity传入的数据
        private String[] fragmentData;
    
        // 修改构造方法,接收FragmentManager和数据参数
        public TabFragmentPagerAdapter(@NonNull FragmentManager fm, String[] fragmentData) {
            super(fm);
            this.fragmentData = fragmentData;
        }
    
        @NonNull
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            switch (position){
                case 0:
                    tab1Fragment tab1 = new tab1Fragment();
                    Bundle bundle1 = new Bundle();
                    // 使用传入的数据
                    bundle1.putString("edttext", fragmentData[0]);
                    tab1.setArguments(bundle1);
                    return tab1;
                case 1:
                    tab2Fragment tab2 = new tab2Fragment();
                    Bundle bundle2 = new Bundle();
                    bundle2.putString("edttext1", fragmentData[1]);
                    tab2.setArguments(bundle2);
                    return tab2;
                case 2:
                    tab3Fragment tab3 = new tab3Fragment();
                    Bundle bundle3 = new Bundle();
                    bundle3.putString("edttext2", fragmentData[2]);
                    tab3.setArguments(bundle3);
                    return tab3;
                default:
                    return null;
            }
        }
    
        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return title[position];
        }
    
        @Override
        public int getCount() {
            return title.length;
        }
    }
    
  2. 在MainActivity中传入数据给PagerAdapter
    在创建TabFragmentPagerAdapter实例时,把需要传递的数据传进去:

    package com.example.tablay;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.viewpager.widget.ViewPager;
    
    import android.os.Bundle;
    import com.google.android.material.tabs.TabLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        private ViewPager pager;
        private TabLayout tabs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            pager = findViewById(R.id.pager);
            tabs = findViewById(R.id.tabs);
    
            // 准备要传递给各个Fragment的数据
            String[] dataToFragments = {"给Tab1的数据", "给Tab2的数据", "给Tab3的数据"};
            // 创建Adapter时传入数据
            pager.setAdapter(new TabFragmentPagerAdapter(getSupportFragmentManager(), dataToFragments));
            tabs.setupWithViewPager(pager);
            tabs.setTabGravity(TabLayout.GRAVITY_FILL);
        }
    }
    
  3. 修改对应Fragment接收数据(以tab3Fragment为例)
    如果之前的tab3Fragment没有处理数据接收,补充逻辑:

    package com.example.tablay;
    
    import android.os.Bundle;
    import androidx.fragment.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class tab3Fragment extends Fragment {
    
        public tab3Fragment() {
            // Required empty public constructor
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_tab3, container, false);
            TextView tes = view.findViewById(R.id.testtab3);
            // 接收数据
            String strtext = getArguments().getString("edttext2");
            tes.setText(strtext);
            return view;
        }
    }
    

这样就能实现从Activity把数据传递给PagerAdapter,再分发给各个Fragment的需求了。


内容的提问来源于stack exchange,提问作者Ashen Dinusha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:55:13