Android 应用程序进入后台时销毁碎片

Android 应用程序进入后台时销毁碎片,android,android-fragments,Android,Android Fragments,我面临一个问题,我有一个名为“MainActivity”的活动,它有4个片段。问题是,如果我在片段2、片段3或片段4中,应用程序会进入后台,如: 如果我打开底部导航,应用程序转到后台,在底部导航关闭后,它会将我重定向到第一个片段(默认片段) 如果我最小化应用程序,然后再次恢复,请转到第1个片段 如果我的手机进入睡眠状态,然后我再次使用它将我重定向到第一个片段 我不明白为什么会出现这种行为。请告诉我可能的解决办法 以下是主要活动代码: public class ContainerActivi

我面临一个问题,我有一个名为“MainActivity”的活动,它有4个片段。问题是,如果我在片段2、片段3或片段4中,应用程序会进入后台,如:

  • 如果我打开底部导航,应用程序转到后台,在底部导航关闭后,它会将我重定向到第一个片段(默认片段)

  • 如果我最小化应用程序,然后再次恢复,请转到第1个片段

  • 如果我的手机进入睡眠状态,然后我再次使用它将我重定向到第一个片段

  • 我不明白为什么会出现这种行为。请告诉我可能的解决办法

    以下是主要活动代码:

    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”不要打电话。它不会第一次调用这个默认片段。如果我走到另一个碎片,然后回来,它就会打开