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

问题描述 投票:0回答:1

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

SongFragment

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;
        }
    }

感谢您的帮助。

android android-fragments nullpointerexception android-fragmentactivity
1个回答
0
投票

方法fragment.RefreshButtons();返回一个NPE,因为如果您按应有的方式实现了SectionsPagerAdapter,则getItem()返回该片段的一个新实例,该实例尚未附加到片段管理器,因此导致[C0 ]。

所以您应该做的是得到一个当前活动的片段实例,如下所示:

Nullpointer exception

[ Fragment frag = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, 0); 是片段的位置,因此,例如,如果您有3个片段,0将返回第一个片段实例,等等...

© www.soinside.com 2019 - 2024. All rights reserved.