在两个以上片段之间传递数据

Posted

技术标签:

【中文标题】在两个以上片段之间传递数据【英文标题】:Passing data among more than two fragments 【发布时间】:2018-04-16 23:35:36 【问题描述】:

我成功实现了使用接口将数据从一个片段传递到另一个片段。

MainActivity.java

MainActivity.java
public class MainActivity extends AppCompatActivity implements InputTab.SendMessage, FollowingTab.SendMessage, FollowerTab.SendMessage, ProfileTab.SendMessage, UserSearchResultTab.SendMessage 

    private SectionsPageAdapter pageAdapter;
    ViewPager viewPager;
    public static String currentUser;

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container, new ProfileTab());

        fragmentTransaction.commit();

        pageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        // Sets up the ViewPager with the sections adapter

        viewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(viewPager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager((viewPager));

    

    // Adds fragments to SectionsPageAdapter and gives names for the corresponding tab

    private void setupViewPager(ViewPager viewPager) 
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
        adapter.addFragment(new InputTab(), "Search");
        adapter.addFragment(new ProfileTab(), "Profile");
        adapter.addFragment(new GithubTab(), "Github Repos");
        adapter.addFragment(new FollowerTab(), "Followers");
        adapter.addFragment(new FollowingTab(), "Followings");
        adapter.addFragment(new UserSearchResultTab(), "test");
        viewPager.setAdapter(adapter);
    

    @Override
    public void sendDataToProfile(String message) 
        String tag = "android:switcher:" + R.id.container + ":" + 1;
        ProfileTab profile = (ProfileTab) getSupportFragmentManager().findFragmentByTag(tag);
        profile.displayReceivedData(message);
    

    @Override
   public void sendDataToFollowers(String message) 
       String tag = "android:switcher:" + R.id.container + ":" + 3;
       FollowerTab follower = (FollowerTab) getSupportFragmentManager().findFragmentByTag(tag);
       follower.displayReceivedData(message);
   

InputTab.java 中的接口 sendMessage

// Interface for passing-in data to a different tab(fragment)
interface SendMessage 
    void sendDataToProfile(String message);

    //void sendDataToSearchResult(String message);
    void sendDataToResult(String message);
    //void sendDataToFollowing(String message);

ProfileTab.java 中的接收器

// This is the part where it handles the data passed in from another fragment (tab)
protected void displayReceivedData(String message)

    fetchData(message);

这很好用,但问题是它不适用于两个以上的片段,例如从 A -> B、C、D ...

我遵循了这个特定的教程:https://www.journaldev.com/14207/android-passing-data-between-fragments

所以在我的 MainActivity.java 上,我的 sendDataToFollowers 会给我一个错误,而 sendDataToProfile 工作正常。当我调试它时,FollowerTab 的关注者为空。

有什么可能的解决方案使它适用于两个以上的片段?

【问题讨论】:

@AmitVaghela 但我没有将数据发送到我的活动。我必须将数据发送到属于 TabLayout 的另一个片段 你的意思是,当你在标签之间切换时你想传递数据吗? 是的,没错 【参考方案1】:

你可以试试这个,

标签 0

getParent().getIntent().putExtra("key", "value"); 

标签 1

String value = getParent().getIntent().getStringExtra("key");

另一种方式:

您必须将信息返回到片段的活动。并且您的 Activity 将信息调度到其片段:

// In fragment A
((ParentActivity)getActivity()).dispatchInformations("test");

// In ParentActivity
public void dispatchInformations(String mesg)
    fragmentB.sendMessage(mesg);

【讨论】:

【参考方案2】:

ViewPager's fragments 之间传递数据的最佳方式是使用EventBus 并将数据保存到您的Activity

    使用EventBusLocalBroadCastRecevier 将数据立即发送到活动fragments(通常一次有3个活动片段)。

    EventBust.getDefaut().sendData(YourDataObject);

    在活动中保存数据,这样当fragment处于活动状态时,只需从onViewCreated中的活动中拉取保存的数据:

    ((YOurActivity)getActivity()).getSavedData();

【讨论】:

以上是关于在两个以上片段之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航抽屉中的两个片段之间传递数据

在片段之间传递数据

在 Android 中的两个 Fragment 之间传递数据都有哪些不同的方式? [复制]

通过导航组件在底部导航片段之间传递数据

片段和活动之间没有传递值

如何在底部导航片段(或导航抽屉)之间传递数据?