Android 访问ViewPager片段视图
我有一个viewpager,里面有两个片段页面。现在我想从第一个片段页面访问视图(textview,按钮),但每次我都会遇到Nullpointer异常 查看我的代码 片段我要访问其视图:Android 访问ViewPager片段视图,android,android-fragments,nullpointerexception,android-viewpager,Android,Android Fragments,Nullpointerexception,Android Viewpager,我有一个viewpager,里面有两个片段页面。现在我想从第一个片段页面访问视图(textview,按钮),但每次我都会遇到Nullpointer异常 查看我的代码 片段我要访问其视图: public class ListPagerFragment extends Fragment { ListView listview; TextView text; private ViewPager pager; public static ListPage
public class ListPagerFragment extends Fragment
{
ListView listview;
TextView text;
private ViewPager pager;
public static ListPagerFragment newInstance(int message)
{
ListPagerFragment f = new ListPagerFragment();
// pass the text message received from main activity into a bundle to be
// delivered to the new fragment
Bundle bdl = new Bundle();
bdl.putInt("num", message);
f.setArguments(bdl);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.list_pager_fragment, container, false);
return v;
}
public void fillList(Nameslist list)
{
listview = (ListView) getView().findViewById(R.id.listView1);
if (listview == null)
System.out.println("listview null"); //this should not be null but
//it is thus the nullpointerexception
if (listview.getAdapter() == null)
{
MyListAdapter listAdapter = new MyListAdapter(getActivity(), R.layout.listview_item, list.getVenues());
listview.setAdapter(listAdapter);
}
else
{
((MyListAdapter) listview.getAdapter()).updateAdapter(list.getnames());
}
}
PagerAdapter代码
public class MyPagerAdapter extends FragmentStatePagerAdapter
{
private int mCount = 1;
public MyPagerAdapter(FragmentManager fm)
{
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int position)
{
switch (position)
{
case 1:
return ResultsPagerFragment.newInstance(position);
}
return ListPagerFragment.newInstance(position);
}
@Override
public int getCount()
{
// TODO Auto-generated method stub
return mCount;
}
}
最后是主要活动代码
private ViewPager pager;
private MyPagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
}
后来在活动的某个地方,我有了代码,可以从片段触发fillList来完成这项工作
Fragment frag = pagerAdapter.getItem(0); //this should give me the Fragment i want right?
((ListPagerFragment)frag).fillList(result);
我在这里遗漏了什么?这可能是因为在ListPagerFragment.onCreateView()膨胀xml布局之前,您试图使用活动中的视图。将onCreate()和一些fillList()代码中的内容移动到onCreateView(),类似如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.list_pager_fragment, container, false);
listview = (ListView) v.findViewById(R.id.listView1);
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
pager = (ViewPager) v.findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
return v;
}
在片段onCreateView()使视图膨胀后,可以尝试填充它
不要忘记在onDestroyView()中清除视图引用并注销listview侦听器(如果设置了),以避免内存泄漏,例如:
@Override
public void onDestroyView() {
super.onDestroyView();
listview.setOnItemClickListener(null);
...
listview = null;
}
了解片段的生命周期-->好的,我发现问题似乎出在我的自定义FragmentStatePagerAdapter中 我所要做的就是在创建活动时创建片段,并将它们放入ArrayList中,稍后将其传递给MyPagerAdapter
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
frags = new ArrayList<Fragment>();
frags.add(ListPagerFragment.newInstance(0));
frags.add(ResultsPagerFragment.newInstance(1));
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),frags);
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
}
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
frags=新的ArrayList();
add(ListPagerFragment.newInstance(0));
add(ResultsPagerFragment.newInstance(1));
pagerAdapter=新的MyPagerAdapter(getSupportFragmentManager(),frags);
pager=(ViewPager)findViewById(R.id.pager);
寻呼机设置适配器(pagerAdapter);
}
然后修改MyPagerAdapter,如下所示:
public class MyPagerAdapter extends FragmentStatePagerAdapter
{
private List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, List<Fragment> frags)
{
super(fm);
this.fragments = frags;
}
@Override
public Fragment getItem(int position)
{
return fragments.get(position);
}
}
公共类MyPagerAdapter扩展了FragmentStatePagerAdapter
{
私有列表片段;
公共MyPagerAdapter(碎片管理器fm,列出碎片)
{
超级(fm);
这个碎片=碎片;
}
@凌驾
公共片段getItem(int位置)
{
返回碎片。获取(位置);
}
}
有点傻,不是吗?我不明白这一点,但它起了作用您确定在
onCreateView()之后调用了您的函数吗
?在你看不到之前,谢谢,我已经考虑过这种可能性。我很确定在创建片段之前我不会采取任何行动。我试过你的代码,但运气不好:/对我的有什么想法吗?