Java 在两个以上的片段之间传递数据
我使用接口成功地实现了将数据从一个片段传递到另一个片段 MainActivity.javaJava 在两个以上的片段之间传递数据,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
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的一部分。你的意思是,当你在选项卡之间切换时,你想传递数据,对吗?是的,没错