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

Posted

技术标签:

【中文标题】带有片段的 Android Up 按钮未显示完整片段【英文标题】:Android Up button with fragments not showing complete fragment 【发布时间】:2021-12-02 09:56:17 【问题描述】:

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

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) 

               

           );
    


【问题讨论】:

【参考方案1】:

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

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

getFragmentManager() 实际上是指您的TabsFragment 已添加到的FragmentManager - 这就是该方法为deprecated 并替换为getParentFragmentManager() 的原因,这更明确地说明了FragmentManager 的含义。

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

【讨论】:

你说的太对了。我已经看到 getFragmentManager 已被弃用,但 android studio 已经生成了选项卡,我没有移动任何东西,因为我正在学习。谢谢

以上是关于带有片段的 Android Up 按钮未显示完整片段的主要内容,如果未能解决你的问题,请参考以下文章