在按下后退按钮的片段中,活动为空白

 jasonmysh 发布于 2023-02-13 12:39

我有一个活动和许多碎片在同一个膨胀 FrameLayout


示例:mainActivity>任何片段(按后退按钮)>活动为空.

在onCreate:

layout = (FrameLayout)findViewById(R.id.content_frame);
layout.setVisibility(View.GONE);

当我开始片段时:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
ft.addToBackStack(null);
ft.commit();
layout.setVisibility(View.VISIBLE);

我想我需要GONE在后退时再次使frameLayout的可见性,但我该怎么做?


我尝试onBackPressed并设置layout.setVisibility(View.GONE);但我无法通过片段返回,因为我直接进入主页.

5 个回答
  • 如果您在活动中使用了多个片段,或者即使您只有一个片段,那么第一个片段也不应该定义addToBackStack.由于这允许返回导航,因此在此片段之前将显示空活动布局.

     // fragmentTransaction.addToBackStack() // dont include this for your first fragment.
    

    但是对于另一个片段,你需要定义它,否则后面将不会导航到早期的屏幕(片段),而是应用程序可能会关闭.

    2023-02-13 12:40 回答
  • @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        }
        else {
            int fragments = getSupportFragmentManager().getBackStackEntryCount();
            if (fragments == 1) {
                finish();
            } else if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
    

    添加片段

     getSupportFragmentManager().beginTransaction()
                    .replace(R.id.layout_main, dashboardFragment, getString(R.string.title_dashboard))
                    .addToBackStack(getString(R.string.title_dashboard))
                    .commit();
    

    2023-02-13 12:40 回答
  • 如果你想通过片段跟踪,你应该覆盖onBackPressed方法,就像这样

    public void onBackPressed() { 
       if (getFragmentManager().getBackStackEntryCount() == 1) {
            finish();
       } else {
            super.onBackPressed();
       }
    }
    

    2023-02-13 12:40 回答
  • 您可以覆盖onBackPressed并检查后台堆栈上是否有任何内容.

    @Override
    public void onBackPressed() {
        int fragments = getFragmentManager().getBackStackEntryCount();
        if (fragments == 1) { 
            // make layout invisible since last fragment will be removed
        }
        super.onBackPressed();
    }
    

    2023-02-13 12:41 回答
  • 回复晚了非常抱歉.

    你不必添加 ft.addToBackStack(null); 同时添加第一个片段.

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.content_frame, profileFragment);
    // ft.addToBackStack(null); --remove this line.
    ft.commit();
    // ... rest of code
    

    2023-02-13 12:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有