Android 从父活动调用时,片段视图为空
我有一个活动及其子片段,其中包含一个Android 从父活动调用时,片段视图为空,android,android-fragments,nullpointerexception,android-fragmentactivity,Android,Android Fragments,Nullpointerexception,Android Fragmentactivity,我有一个活动及其子片段,其中包含一个LinearLayout,我在其中生成按钮。创建片段后,一切都正常运行。但是,当父活动下载一个新项目时,我调用片段中的方法,该方法用于生成按钮并将它们添加到视图中,但是LinearLayout返回null,我不知道为什么。我要么需要修复它,要么想办法“重新显示”我的片段。以下是相关代码: 歌曲片段: LinearLayout linearLayout; DatabaseHelper databaseHelper; @Nullable @Override pu
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
...
}
//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;
}
}
主要活动:
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
...
}
//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;
}
}
感谢您的帮助。方法
fragment.RefreshButtons()
返回一个NPE,因为如果您像应该的那样实现了SectionsPagerAdapter
,getItem()
返回该片段的一个新实例,该实例尚未连接到片段管理器,因此会导致空指针异常
因此,您应该做的是获得一个当前活动片段实例,如下所示:
Fragment frag = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, 0);
0
是片段的位置,因此,例如,如果您有3个片段,0
将返回第一个片段实例等。如果您的用例允许,最快的“修复”将是将寻呼机适配器屏幕外视图限制增加到等于项目计数,这将防止片段视图被破坏,但可能会花费一些额外的内存。@Pawel我认为视图不会被破坏,因为当代码运行时,它就在屏幕上called@EthanShoe您可以在中添加getItem()方法中的代码吗sectionsPagerAdapter@Vince当然,就是这样