带有片段的 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 按钮未显示完整片段的主要内容,如果未能解决你的问题,请参考以下文章

Listview 项目未在 Fragment Android 中显示

Android Layout 未显示或显示在前一个布局下方

带有片段和底部导航栏的 Android FloatingActionButton

未创建 Android listview 内容视图

带有许多片段的 Android 导航抽屉

Android Navigation java.language.IllegalStateException 片段类未设置