findFragmentByTag在除了一个之外的所有片段上返回null

问题描述:

我知道有一些问题涉及这个问题,但由于它不使用fragment转换(我不知道它是如何工作的,因此我没有使用它) 。findFragmentByTag在除了一个之外的所有片段上返回null

什么我MainActivity所做的是,它的tabBar增加fragments,并创建功能于一身的信息数据传递从一个fragment到另一个fragment

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

数据顺利通过到profileTab,但是当我调试它,它给了我null其他分页像

FollowerTab follower = (FollowerTab) getSupportFragmentManager().findFragmentByTag(tag); 

这一个。因此,每当我尝试向FollowerTab发送数据时,它都会导致崩溃。

我错过了什么,如何才能使它成为非空fragment

在片段事务处理时,您需要为片段添加标记。你还没有为你的片段设置任何标签。这是你得到空的原因。 你需要把标签放在你的片段中。

FragmentA fragment=new FragmentA(); 
getSupportFragmentManager() 
.beginTransaction().replace(R.id.container,fragment,"tag").commit(); 

这里标签在你使用的时候返回一个标签findFragmentByTag(tag);

+0

对不起,我必须添加这个?在OnCreate或内部setupViewPager或sendData? – Dawn17

+0

@ Dawn17,你想要对标签的点击执行一些操作,然后你可以使用标签点击监听器或内部onclick方法,你可以编写你的代码,可以帮助你。或者你可以检查[https://stackoverflow.com/questions/44132964/how-to-add-fragment-tag-in-a-fragmentpageradapter-to-reference-the-fragment-late],这可能会帮助你 –