从父活动调用时,片段视图为空

Posted

技术标签:

【中文标题】从父活动调用时,片段视图为空【英文标题】:Fragment View is Null When Called From Parent Activity 【发布时间】:2020-04-09 10:00:54 【问题描述】:

我有一个带有LinearLayout 的活动及其子片段,我在其中生成按钮。创建片段后,一切运行正常。但是,当父活动下载一个新项目时,我调用片段中用于生成按钮并将它们添加到视图中的方法,但是LinearLayout 返回 null,我不知道为什么。我要么需要修复它,要么找到一种方法来“重新显示”我的片段。下面是相关代码:

歌曲片段

LinearLayout linearLayout;
DatabaseHelper databaseHelper;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_song, container, false);
    linearLayout = rootView.findViewById(R.id.songFragmentMainLayout);
    databaseHelper = new DatabaseHelper(getActivity());

    return rootView;


@Override
public void onResume() 
    super.onResume();

    RefreshButtons();


public void RefreshButtons()
    linearLayout.removeAllViews(); //this line is where the NullPointerException is called
    ...

MainActivity

                    //refresh fragment view
                    SongFragment fragment = (SongFragment) sectionsPagerAdapter.getItem(0);
                    if(downloadQueue.size() == 0)
                        fragment.RefreshButtons();
                        Toast.makeText(context, "New songs downloaded", Toast.LENGTH_SHORT).show();
                    

...

public class SectionsPagerAdapter extends FragmentPagerAdapter 

        public SectionsPagerAdapter(FragmentManager fm) 
            super(fm);
        

        @Override
        public Fragment getItem(int position) 
            Fragment fragment = null;
            switch (position) 
                case 0:
                    fragment = new SongFragment();
                    break;
                case 1:
                    fragment = new PlaceholderFragment();
                    break;
            
            return fragment;
        

        @Override
        public int getCount() 
            return 2;
        

        @Override
        public CharSequence getPageTitle(int position) 
            switch (position) 
                case 0:
                    return "Songs";
                case 1:
                    return "Playlists";
            
            return null;
        
    

感谢您的帮助。

【问题讨论】:

如果您的用例允许它最快的“修复”是将寻呼机适配器屏幕外视图限制增加到等于项目数,这将防止碎片视图被破坏,但可能会花费一些额外的内存。 @Pawel 我认为视图没有被破坏,因为调用代码时它在屏幕上 @EthanShoe 你能在sectionPagerAdapter 中添加getItem() 方法中的代码吗 @Vince 当然,刚刚做了 【参考方案1】:

fragment.RefreshButtons(); 方法返回一个 NPE,因为如果您按照应有的方式实现了SectionsPagerAdaptergetItem() 会返回该片段的新实例,该实例尚未附加到片段管理器,因此导致Nullpointer exception

所以你应该做的是得到一个当前活动的片段这样的实例:

 Fragment frag = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, 0);

0 是片段的位置,例如,如果您有 3 个片段,0 将返回第一个片段实例等...

【讨论】:

以上是关于从父活动调用时,片段视图为空的主要内容,如果未能解决你的问题,请参考以下文章

onCreateView()没有第二次调用

方向更改后片段中的 getActivity() 为空

如何缓存片段视图

片段未附加到我的活动

方向更改时,片段视图为空

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常