2017-11-04 12 views
3

インタフェースを使用して、あるフラグメントから別のフラグメントにデータを渡すことに成功しました。2つ以上のフラグメント間でデータを渡す

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); 
} 

これはうまくいきますが、の問題は2つ以上のフラグメントでは機能しないということです。 - > B、C、D ...

私は、この特定のチュートリアルに続く:sendDataToProfileが正常に動作しながら、だから私のMainActivity.javaに、私のsendDataToFollowersは私にエラーを与えるだろうhttps://www.journaldev.com/14207/android-passing-data-between-fragments

を。私がそれをデバッグしたとき、FollowerTabフォロワーはnullでした。

2つ以上のフラグメントで機能するようにするにはどうすればよいでしょうか?あなたはこれを試すことができ

+0

@AmitVaghelaしかし、私はないですアクティビティにデータを送信します。私はTabLayoutの一部である別のフラグメントにデータを送信する必要があります – Dawn17

+0

あなたは、データを正しく渡したいタブの間を変更するとき、あなたは意味しますか? –

+0

はいいいえ – Dawn17

答えて

0

タブ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); 
} 
+0

@ Dawn17それを知ってよかったことは助けになりました。 –

0

ViewPager's fragmentsの間でデータを渡すための最良の方法は、EventBusを使用して、あなたのActivityにデータを保存しています。 (一度に通常存在している3活性な断片)をすぐにアクティブfragmentsにデータを送信するためにEventBusまたはLocalBroadCastRecevierを使用して

  1. EventBust.getDefaut().sendData(YourDataObject);

  2. 活動における

    保存データ、fragmentがアクティブであるとき、ちょうどonViewCreatedでの活動から保存されたデータを引くように

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

関連する問題