Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在两个以上的片段之间传递数据_Java_Android_Android Studio_Android Fragments_Fragment - Fatal编程技术网

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

Java 在两个以上的片段之间传递数据,java,android,android-studio,android-fragments,fragment,Java,Android,Android Studio,Android Fragments,Fragment,我使用接口成功地实现了将数据从一个片段传递到另一个片段 MainActivity.java MainActivity.java public class MainActivity extends AppCompatActivity implements InputTab.SendMessage, FollowingTab.SendMessage, FollowerTab.SendMessage, ProfileTab.SendMessage, UserSearchResultTab.SendMe

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

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);
   }
// 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);
}
// This is the part where it handles the data passed in from another fragment (tab)
protected void displayReceivedData(String message)
{
    fetchData(message);
}
inputAB.java中的接口sendMessage

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);
   }
// 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);
}
// This is the part where it handles the data passed in from another fragment (tab)
protected void displayReceivedData(String message)
{
    fetchData(message);
}
ProfileTab.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);
   }
// 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);
}
// 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

我遵循了以下具体教程:

因此,在MainActivity.java上,sendDataToFollowers会在sendDataToProfile正常工作时给我一个错误。当我调试它时,FollowerTab follower为null

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

您可以试试这个

选项卡0

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

String value = getParent().getIntent().getStringExtra("key");
另一种方式:

您必须返回片段活动的信息。并将您的活动分派信息发送到其片段:

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

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

ViewPager片段之间传递数据的最佳方法是使用并将数据保存到
活动中

  • 使用
    EventBus
    localbroadcastReceiver
    将数据立即发送到活动
    片段(通常一次有3个活动片段)

    EventBust.getDefaut().sendData(YourDataObject)

  • 在活动中保存数据,以便当
    片段
    处于活动状态时,只需从
    onViewCreated
    中的活动中提取保存的数据:

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


  • @AmitVaghela,但我不会将数据发送到我的活动。我必须将数据发送到另一个片段,它是tablayout的一部分。你的意思是,当你在选项卡之间切换时,你想传递数据,对吗?是的,没错