在Android Studio片段之间切换时地图片段不隐藏

Posted

技术标签:

【中文标题】在Android Studio片段之间切换时地图片段不隐藏【英文标题】:Map fragment is not hidden when switch between fragments Android Studio 【发布时间】:2021-08-26 02:44:56 【问题描述】:

我正在尝试使用底部导航在片段之间切换。但是,如果我从地图片段切换到其他片段,地图片段仍然在后台,而其他片段则显示在前面。

请在此处查看我的代码:

public class MainActivity extends AppCompatActivity 

    private FragmentManager fragmentManager;
    private Fragment messageFragment = new MessageFragment();
    private Fragment mapFragment = new MapsFragment();

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

        fragmentManager.beginTransaction().add(R.id.hostFragment, mapFragment, null).commit();
        fragmentManager.beginTransaction().add(R.id.hostFragment, messageFragment, null).commit();
        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
        //bottomNavigationView.setSelectedItemId(R.id.mapsFragment);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
    

    private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() 
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) 
            switch (item.getItemId()) 
                case R.id.mapsFragment:
                    fragmentManager.beginTransaction().hide(messageFragment).show(mapFragment).commit();
                    break;
                case R.id.messageFragment:
                    fragmentManager.beginTransaction().hide(mapFragment).show(messageFragment).commit();
                    break;
            
            return true;
        
    ;

【问题讨论】:

你能分享这两个片段的 XML 吗? 【参考方案1】:

您的问题

您将两个片段添加到同一个容器R.id.hostFragment

fragmentManager.beginTransaction().add(R.id.hostFragment, mapFragment, null).commit();
fragmentManager.beginTransaction().add(R.id.hostFragment, messageFragment, null).commit();

根据hide 和show 的文档,这意味着您隐藏然后显示相同的容器

解决方案

使用两个不同的容器视图:

fragmentManager.beginTransaction().add(R.id.mapContainer, mapFragment, null).commit();
fragmentManager.beginTransaction().add(R.id.messageContainer, messageFragment, null).commit();

另一种解决方案

使用replace,而不是隐藏和显示。

fragmentManager.beginTransaction().add(R.id.hostFragment, mapFragment, null).commit();
// Don't add this in `onCreate`
// fragmentManager.beginTransaction().add(R.id.hostFragment, messageFragment, null).commit();

...

    // Replace the fragment currently being displayed
    switch (item.getItemId()) 
        case R.id.mapsFragment:
            fragmentManager.beginTransaction().replace(R.id.hostFragment, mapFragment).commit();
            break;
        case R.id.messageFragment:
            fragmentManager.beginTransaction().replace(R.id.hostFragment, messageFragment).commit();
            break;
    

【讨论】:

以上是关于在Android Studio片段之间切换时地图片段不隐藏的主要内容,如果未能解决你的问题,请参考以下文章

通过片段之间的导航传递数据android studio

Android Studio - 在片段之间更改时底部导航崩溃

Android中切换标签片段之间的延迟

Android:在视图/活动/片段之间滑动切换

Android:使用选项卡在不同片段之间切换

手电筒片段 Android Studio