gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:56:12 28 4
gpt4 key购买 nike

我的应用使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com