首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当应用程序进入后台时碎片销毁

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

Stack Overflow用户
提问于 2020-08-28 07:11:27
回答 1查看 441关注 0票数 0

我面临一个问题,我有一个名为"MainActivity“的活动,它有4个片段。问题是,如果我在片段2或3或4中,应用程序会转到后台,如下所示:

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

  1. ,如果我最小化应用程序,然后再继续运行,请转到第1段

  1. ,如果我的手机睡着了,然后我在上面重定向到第一段。

我不明白为何会出现这种行为。请给我建议可能的解决办法。

以下是主要的活动代码:

代码语言:javascript
运行
复制
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();
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-28 08:01:40

在您的问题中,您是说当活动从后台恢复时,我假设默认片段将打开(restaurantListFragment)。这是因为

onResume()方法

代码语言:javascript
运行
复制
@Override
protected void onResume() {
    super.onResume();
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_container, restaurantListFragment).addToBackStack(null).commit();
}

替换它(片段只有在某个时候为空或分离时才会更改)

代码语言:javascript
运行
复制
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中的片段

代码语言:javascript
运行
复制
@Override
    protected void onCreate(Bundle savedInstanceState){
    ...
    //below initViews();
    ...
    fm.replace(R.id.fragment_container, restaurantListFragment).addToBackStack(null).commit();
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63629102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档