如何解决当应用程序进入后台时碎片销毁
我遇到了一个问题,我有一个名为“ MainActivity”的活动,其中包含4个片段。问题是,如果我位于片段2或3或4中,并且该应用程序进入后台,如:
-
如果我打开底部导航,然后将应用转到后台,则在底部导航关闭后,它将我重定向到第一个片段(默认片段)。
-
如果我最小化应用程序,然后再次恢复它,请转到第一个片段
-
如果我的手机进入睡眠状态,然后我又在手机上将我重定向到第一个片段。
我不明白为什么会出现这种现象。请给我建议可能的解决方案。
这是主要的活动代码:
public class ContainerActivity extends AppCompatActivity
implements BottomNavigationView.OnNavigationItemSelectedListener{
private Fragment fragment;
private BottomNavigationView bottomNavigationView;
private RestaurantListFragment restaurantListFragment;
private String completeAddress,cityName,countryName,latitude,longitude,nickName,addressLabel,locationType,currentLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
if(getIntent().getExtras() != null){
latitude = getIntent().getExtras().getString("latitude");
longitude = getIntent().getExtras().getString("longitude");
completeAddress = getIntent().getExtras().getString("complete_address");
cityName = getIntent().getExtras().getString("city_name");
countryName = getIntent().getExtras().getString("country_name");
nickName = getIntent().getExtras().getString("nick_name");
addressLabel = getIntent().getExtras().getString("label");
locationType = getIntent().getExtras().getString("location_type");
currentLock = getIntent().getExtras().getString("current_lock");
Bundle bundle = new Bundle();
bundle.putString("latitude",latitude);
bundle.putString("longitude",longitude);
bundle.putString("complete_address",completeAddress);
bundle.putString("city_name",cityName);
bundle.putString("country_name",countryName);
bundle.putString("nick_name",nickName);
bundle.putString("label",addressLabel);
bundle.putString("location_type",locationType);
bundle.putString("current_lock",currentLock);
restaurantListFragment.setArguments(bundle);
}
}
@Override
protected void onResume() {
super.onResume();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null).commit();
}
private void initView() {
bottomNavigationView = findViewById(R.id.btoom_navigation_view);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
bottomNavigationView.setSelectedItemId(R.id.home);
restaurantListFragment = new RestaurantListFragment();
}
public void openRestaurantMenuFragment(Bundle bundle) {
RestaurantMenuFragment restaurantMenuFragment = new RestaurantMenuFragment();
restaurantMenuFragment.setArguments(bundle);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,restaurantMenuFragment)
.addToBackStack(null)
.commit();
}
public void openFoodListOrDetailFrgment() {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,new FoodDetailFragment())
.addToBackStack(null)
.commit();
}
public void openCart(){
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,new MyOrderFragment())
.addToBackStack(null)
.commit();
}
public void openCompleteItemDetailFragment(){
bottomNavigationView.setVisibility(View.GONE);
}
public void showBottomNavigation(){
if(bottomNavigationView.getVisibility() == View.GONE){
bottomNavigationView.setVisibility(View.VISIBLE);
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
switch (item.getItemId()) {
case R.id.home:
if ((getSupportFragmentManager().findFragmentById(R.id.fragment_container)) != null && !(fragment instanceof RestaurantListFragment)){
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container,new RestaurantListFragment()).addToBackStack(null).commit();
}
break;
case R.id.explore:
break;
case R.id.profile:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,new ProfileFragment())
.addToBackStack(null)
.commit();
break;
}
return true;
}
@Override
public void onBackPressed() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if(fragment instanceof RestaurantListFragment){
getSupportFragmentManager().popBackStack(0,getSupportFragmentManager().POP_BACK_STACK_INCLUSIVE);
}
if(fragment instanceof CompleteFoodItemDetailFragment || fragment instanceof GoogleMapFragment){
if(bottomNavigationView.getVisibility() == View.GONE){
bottomNavigationView.setVisibility(View.VISIBLE);
}
}
super.onBackPressed();
}
}
解决方法
在您的问题中,您是说我想从后台恢复活动时会打开默认片段(restaurantListFragment)。这是由于
onResume()方法
@Override
protected void onResume() {
super.onResume();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null).commit();
}
替换为(片段只有在空着或分离时才会更改)
private fm;
initViews(){
fm = supportFragmentManager.beginTransaction();
}
@Override
protected void onResume() {
super.onResume();
if(fm.isEmpty() || restaurantListFragment.isDetached()){
fm.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null).commit();
}
}
还要替换onCreate中的片段
@Override
protected void onCreate(Bundle savedInstanceState){
...
//below initViews();
...
fm.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null).commit();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。