Android 带有片段的向上按钮未显示完整片段

Android Up button with fragments not showing complete fragment

你好,我有一个 activity A,带有一个发送到 Activity B 的按钮,启用了 ActionBar 和向上按钮,这个 activity 有带有片段的选项卡和一个发送到与选项卡无关的新片段 C。通过单击后退按钮,它应该 return 到选项卡。后退按钮有效并显示选项卡但不包含。我做错了什么?这是一些代码。 提前致谢。 Activity乙

public class BackActivity extends AppCompatActivity {

  
...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_back);
        // get fragment manager

        myChildToolbar =(Toolbar)findViewById(R.id.my_child_toolbar2);
        setSupportActionBar(myChildToolbar);
        // Get a support ActionBar corresponding to this toolbar
        ActionBar ab = getSupportActionBar();

        // Enable the Up button
        ab.setDisplayHomeAsUpEnabled(true);

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
               
       myChildToolbar.setTitle(R.string.menu_ver_lista);
       Bundle bundle=new Bundle();
           bundle.putInt(NuevoinformeFragment.INFORMESEL,datosRecuperados.getInt(NuevoinformeFragment.INFORMESEL));
                    
     bundle.putString(TabsFragment.ARG_MUESTRA,"true");
                    
     TabsFragment detailFragment = new TabsFragment();
                    detailFragment.setArguments(bundle);
                    ft.add(R.id.back_fragment, detailFragment);
                   


       ft.commit();
      }
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return false;
    }
  
}

标签片段

   
    TabLayout tabs;
    ViewPager viewPager;
    private ListaDetalleViewModel mViewModel;
   
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_lista_tabs, container, false);


        mViewModel = new ViewModelProvider(requireActivity()).get(ListaDetalleViewModel.class);


 
        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        Bundle bundle = getArguments();
       
        viewPager = view.findViewById(R.id.view_pager);

        tabs = view.findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
 mViewModel.cargarPestañas(ciudadNombre).observe(getViewLifecycleOwner(), words -> {
          
            configureTabLayout();

        });

    }

    private void configureTabLayout() {

        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter( getFragmentManager(),clientes, mViewModel,clientesplan);
        viewPager.setAdapter(sectionsPagerAdapter);
   
        viewPager.addOnPageChangeListener(new
                TabLayout.TabLayoutOnPageChangeListener(tabs));
        tabs.addOnTabSelectedListener(new
               TabLayout.OnTabSelectedListener() {
               @Override
               public void onTabSelected(TabLayout.Tab tab) {



                   viewPager.setCurrentItem(tab.getPosition());
               }

               @Override
               public void onTabUnselected(TabLayout.Tab tab) {

               }

               @Override
               public void onTabReselected(TabLayout.Tab tab) {

               }

           });
    }

}

您在创建 SectionsPagerAdapter 时使用了错误的 FragmentManager,您应该在此处使用 getChildFragmentManager()

SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(
   getFragmentManager(), // This is the problem
   clientes, mViewModel,clientesplan
);

getFragmentManager() 实际上指的是您的 TabsFragment 已添加到的 FragmentManager - 这就是为什么该方法是 deprecated and replaced with getParentFragmentManager(),这更明确地说明了 FragmentManager表示.

只要您创建的片段完全包含在另一个片段的布局中,它就需要通过添加到 getChildFragmentManager() 成为子片段。这确保它正确地通过生命周期状态(例如在其父级重新创建其视图时重新创建其视图)并确保片段的状态被正确保存和恢复。