繁体   English   中英

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

[英]Map fragment is not hidden when switch between fragments Android Studio

我正在尝试使用底部导航在片段之间切换。 但是,如果我从 map 片段切换到其他片段,则 map 片段仍在背景中,而其他片段则显示在前面。

在此处输入图像描述

在此处输入图像描述

请在此处查看我的代码:

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

你的问题

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

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

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

一个解法

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

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

另一种解决方案

使用替换而不是隐藏和显示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM