Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 访问ViewPager片段视图_Android_Android Fragments_Nullpointerexception_Android Viewpager - Fatal编程技术网

Android 访问ViewPager片段视图

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

我有一个viewpager,里面有两个片段页面。现在我想从第一个片段页面访问视图(textview,按钮),但每次我都会遇到Nullpointer异常 查看我的代码

片段我要访问其视图:

    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()之后调用了您的函数吗
?在你看不到之前,谢谢,我已经考虑过这种可能性。我很确定在创建片段之前我不会采取任何行动。我试过你的代码,但运气不好:/对我的有什么想法吗?