Android Studio(Java):切换两个Fragment不重建方案失效?
Android Fragment切换保留状态(显示/隐藏模式)问题
我尝试让Android应用切换Fragment时保留用户在Fragment内的操作,要求切换时不重建或替换Fragment,仅通过显示/隐藏实现。比如在Fragment1勾选复选框后切换到Fragment2,再切回Fragment1时复选框仍保持勾选状态。参考相关方案后未能正常工作:从HomeFragment切换到WidgetFragment时,WidgetFragment会叠加在HomeFragment之上。
HomeFragment显示效果:
切换到WidgetFragment后的效果:
WidgetFragment的TextView和复选框叠加在HomeFragment内容上方
代码示例
package loon.si.weather_app; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.FragmentManager; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.MenuItem; import com.google.android.material.navigation.NavigationView; import java.util.Objects; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout drawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); drawerLayout = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open_nav, R.string.close_nav); drawerLayout.addDrawerListener(toggle); toggle.syncState(); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new HomeFragment()).commit(); navigationView.setCheckedItem(R.id.nav_home); } } @Override public void onDestroy() { super.onDestroy(); FragmentManager fragmentManager = getSupportFragmentManager(); if(fragmentManager.findFragmentById(R.id.nav_home) != null){ fragmentManager.beginTransaction().remove(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_home))).commit(); } if(fragmentManager.findFragmentById(R.id.nav_widget) != null){ fragmentManager.beginTransaction().remove(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_widget))).commit(); } } @SuppressLint("NonConstantResourceId") @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { FragmentManager fragmentManager = getSupportFragmentManager(); switch (item.getItemId()){ case R.id.nav_home: if(fragmentManager.findFragmentById(R.id.nav_home) != null) { //if the fragment exists, show it. fragmentManager.beginTransaction().show(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_home))).commit(); } else { //if the fragment does not exist, add it to fragment manager. fragmentManager.beginTransaction().add(R.id.fragment_container, new HomeFragment(), "home").commit(); } if(fragmentManager.findFragmentById(R.id.nav_widget) != null){ //if the other fragment is visible, hide it. fragmentManager.beginTransaction().hide(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_widget))).commit(); } break; case R.id.nav_widget: if(fragmentManager.findFragmentById(R.id.nav_widget) != null) { //if the fragment exists, show it. fragmentManager.beginTransaction().show(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_widget))).commit(); } else { //if the fragment does not exist, add it to fragment manager. fragmentManager.beginTransaction().add(R.id.fragment_container, new WidgetFragment(), "widget").commit(); } if(fragmentManager.findFragmentById(R.id.nav_home) != null){ //if the other fragment is visible, hide it. fragmentManager.beginTransaction().hide(Objects.requireNonNull(fragmentManager.findFragmentById(R.id.nav_home))).commit(); } break; } drawerLayout.closeDrawer(GravityCompat.START); return true; } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)){ drawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } }
内容的提问来源于stack exchange,提问作者johndo19
相关产品推荐
相关产品推荐

