【问题标题】:Map fragment is not hidden when switch between fragments Android Studio在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 吗?

标签: java android google-maps android-fragments


【解决方案1】:

您的问题

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

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

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

解决方案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多