java - 如何在不破坏和重新创建 fragment 的情况下在 fragment 之间切换? (以类似静态的方式)

标签 java android android-studio android-fragments android-menu

我的应用使用 BottomNavigationBar 在 Fragment 之间切换,它是这样做的:

public class MainActivity extends AppCompatActivity {


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

        BottomNavigationView bottomNav = findViewById(R.id.barra);
        bottomNav.setOnNavigationItemSelectedListener(navListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.container, new KeyboardFragment()).commit();
        bottomNav.setSelectedItemId(R.id.keyboard);

    }


    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Fragment selectedFragment = null;

                    switch (item.getItemId()){
                        case R.id.camera:
                            selectedFragment = new CameraFragment();
                            break;
                        case R.id.keyboard:
                            selectedFragment = new KeyboardFragment();
                            break;
                        case R.id.settings:
                            selectedFragment = new SettingsFragment();
                            break;
                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.container,
                            selectedFragment).commit();

                    return true;

                }
            };
}

我希望那些 Fragments 是静态的,这样当我在它们之间切换时它们的内容和 View 不会消失。我试图在 MainActivityonCreate() 方法中创建它们,但它只有助于在 EditText 小部件中保留文本,其余的 View 和内容消失了。

我看过其他类似的问题,但回答得不好,我是新手。在对类似问题的一些回答之后,我尝试使用 add()attach() 之类的函数而不是 replace() 但我不不要认为我做得很好;事实上,有时我的应用程序会崩溃。

我是否也应该在此处粘贴我的 layout.xml 文件?这些 fragment 被“显示”到一个简单的 FrameLayout 中。 预先致谢:)

最佳答案

我是这样成功解决问题的:

  • 首先,所有的Fragments都声明为MainActivity类中的字段,还有变量selected,后面会用到:
public class MainActivity extends AppCompatActivity {

    public KeyboardFragment keyboard_fragment = new KeyboardFragment();
    public CameraFragment camera_fragment = new CameraFragment();
    public SettingsFragment settings_fragment = new SettingsFragment();
    
    Fragment selected = teclado_fragment;`

    //...
  • 然后,在类中也定义了以下方法,其中 R.id.container 是 FrameLayout 或任何用于显示膨胀 fragment 的 View :
    private void createFragment(Fragment fragment){
                 getSupportFragmentManager().beginTransaction()
                .add(R.id.container, fragment)
                .hide(fragment)
                .commit();
    }
    private void showFragment(Fragment fragment){
                 getSupportFragmentManager().beginTransaction()
                .show(fragment)
                .commit();
    }
    private void hideFragment(Fragment fragment){
                 getSupportFragmentManager().beginTransaction()
                .hide(fragment)
                .commit();
    }
  • 最后,在 MainActivityOnCreate() 方法中以这种方式定义了任何菜单的监听器:
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                    switch (item.getItemId()){
                        case R.id.camera:
                            hideFragment(selected);
                            selected = camera_fragment;
                            showFragment(seleccionado);
                            break;
                        case R.id.keyboard:
                            hideFragment(selected);
                            selected = keyboard_fragment;
                            showFragment(seleccionado);
                            break;
                        case R.id.settings:
                            hideFragment(selected);
                            selected = settings_fragment;
                            showFragment(seleccionado);
                            break;
                    }

                    return true;

                }
            };

这样,菜单只是在视觉上隐藏和显示 Fragments,并且它们只被声明一次,在应用程序关闭之前不会被销毁,因此只要应用程序正在运行。

关于java - 如何在不破坏和重新创建 fragment 的情况下在 fragment 之间切换? (以类似静态的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65535621/

相关文章:

java - 使用 Lucene 使多值字段评分了解字段值的计数

java - 在java中显示两个表中的值

android - ADB 回显给出 "No such file or directory"

android - 如何测试 native 应用程序安装横幅是否有效

java - Android房间如何增加计数字段并更新特定的行字段

android - 未使用 RecyclerView.Adapter 内的 onActivityResult

php - Android Studio - 用户名未出现在 phpmyadmin 注册表中

java - Activity 及其 Fragment 的单个布局文件和单个 java 文件

java - 查看邻居节点,前面有n个节点

java - 删除确定按钮