如何从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时把数据传递过去即可:
修改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; } }在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); } }修改对应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
相关产品推荐
相关产品推荐

