Android 应用程序进入后台时销毁碎片
我面临一个问题,我有一个名为“MainActivity”的活动,它有4个片段。问题是,如果我在片段2、片段3或片段4中,应用程序会进入后台,如:Android 应用程序进入后台时销毁碎片,android,android-fragments,Android,Android Fragments,我面临一个问题,我有一个名为“MainActivity”的活动,它有4个片段。问题是,如果我在片段2、片段3或片段4中,应用程序会进入后台,如: 如果我打开底部导航,应用程序转到后台,在底部导航关闭后,它会将我重定向到第一个片段(默认片段) 如果我最小化应用程序,然后再次恢复,请转到第1个片段 如果我的手机进入睡眠状态,然后我再次使用它将我重定向到第一个片段 我不明白为什么会出现这种行为。请告诉我可能的解决办法 以下是主要活动代码: public class ContainerActivi
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();
}
将其替换为(片段只有在某个点为空或分离时才会更改)
也替换onCreate中的片段
@Override
protected void onCreate(Bundle savedInstanceState){
...
//below initViews();
...
fm.replace(R.id.fragment_container, restaurantListFragment).addToBackStack(null).commit();
}
在您的问题中,您是说当活动从后台恢复时,默认片段将打开(restaurantListFragment),我猜想是这样的。这是由于 onResume()方法
@Override
protected void onResume() {
super.onResume();
getSupportFragmentManager().beginTransaction()
.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();
}
请提供碎片交易代码和托管活动代码pliz@OshanMadusanka请check@m'请检查我建议您查看您的'onResume()'方法。为什么您需要再次更换fragment_容器?请提供fragmentsAttach ur fragment事务代码和托管活动代码pliz@OshanMadusanka请check@m'请检查我建议您查看您的'onResume()'方法。为什么你需要再次更换你的碎片容器?谢谢阿里兄弟你的回答,帮了我很多忙。但是当我使用这个代码时,我面临另一个问题。请检查我使用如下工作代码:private FragmentTransaction fm;->private void initView(){fm=getSupportFragmentManager().beginTransaction();}->if(fm.isEmpty()&&restaurantListFragment.isDetached()){fm.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null.commit();}问题是当我第一次打开应用程序时,“restaurantListFragment”不要打电话。它不会第一次调用这个默认片段。如果我去另一个片段,然后回来,它就会打开谢谢你阿里兄弟你的回答,帮了我很多。但是当我使用这个代码时,我面临另一个问题。请检查我使用如下工作代码:private FragmentTransaction fm;->private void initView(){fm=getSupportFragmentManager().beginTransaction();}->if(fm.isEmpty()&&restaurantListFragment.isDetached()){fm.replace(R.id.fragment_container,restaurantListFragment).addToBackStack(null.commit();}问题是当我第一次打开应用程序时,“restaurantListFragment”不要打电话。它不会第一次调用这个默认片段。如果我走到另一个碎片,然后回来,它就会打开