【问题标题】:Fragment getView() always returning null for Fragments created by a FragmentStatePagerAdapter对于 FragmentStatePagerAdapter 创建的 Fragment,Fragment getView() 始终返回 null
【发布时间】:2013-02-09 15:18:29
【问题描述】:

我已经阅读了很多关于片段的内容。发现其他人在检索片段视图时遇到问题,因为始终返回 null 但没有答案解决了我的问题。我想做的是创建一个图片库。我有一个包含图像视图的片段。为了显示片段,我使用了 android.support.v4.view.ViewPager。为了喂ViewPager,我使用android.support.v4.app.FragmentStatePagerAdapter

问题是,当一切都构建并显示图像时,我想将当前显示的图像保存到磁盘。所以我需要获取当前的片段图像视图,但我不能,因为 fragment.getView() 总是为空,与片段关联的活动也是空的,我不知道为什么会这样。这里有一些代码,看看是否有人可以在这里提供帮助:

这是我的片段:

public class ImageViewURLFragment extends Fragment 
{
    String _url;

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) 
    {
        // The last two arguments ensure LayoutParams are inflated
        // properly.
        View rootView = new ImageViewURL(getActivity(), _url);

        return rootView;
    }

    public void setImageURL(String imgURL)
    {
        _url=imgURL;
    }
}

这是我的适配器:

public class ImageViewURLCustomAdapter extends FragmentStatePagerAdapter 
{
    List<String> _urls=new ArrayList<String>();

    public ImageViewURLCustomAdapter(FragmentManager fm) 
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) 
    {
        ImageViewURLFragment fragment = new ImageViewURLFragment();
        fragment.setImageURL(_urls.get(i));

        return fragment;
    }

    public String getItemUrl(int i)
    {
        return _urls.get(i);
    }

    @Override
    public int getCount() {
        return _urls.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "OBJECT " + (position + 1);
    }

    public void addImageURL(String url)
    {
        _urls.add(url);
    }
}

这是主要活动,请注意带有 get 的评论:

public class MainActivity extends FragmentActivity 
{
    ImageViewURLCustomAdapter _iva=null;
    ViewPager _vp=null;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _iva = new ImageViewURLCustomAdapter(
                        getSupportFragmentManager());
        _iva.addImageURL("http://upload.wikimedia.org/wikipedia/commons/b/b4/Saturn_(planet)_large.jpg");
        _iva.addImageURL("http://planetthreesixty.com/sites/default/files/planet.jpg");

        _vp = (ViewPager) findViewById(R.id.viewpager);
        _vp.setAdapter(_iva);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        if(item.getItemId()==R.id.saveToSD)
        {
            int index= _vp.getCurrentItem();
            Fragment fragment=_iva.getItem(index);

            //THis is where I need to get fragment view, but always returns null
                    View view= fragment.getView();
            ImageView iv=(ImageView)view.findViewWithTag("imageView");
            Bitmap bmp=iv.getDrawingCache();


        }


        return super.onOptionsItemSelected(item);
    }
}

对不起,很长的资源,我已经清理了所有我能做的,但我想展示所有的游戏部件。有人能猜到发生了什么吗?

提前致谢。

【问题讨论】:

    标签: android android-layout android-fragments fragmentstatepageradapter


    【解决方案1】:

    所以我需要获取当前的片段图像视图,但我不能,因为 fragment.getView() 始终为 null,与 fragment 也是空的,我不知道为什么。

    这是因为您期望_iva.getItem(index); 返回FragmentViewPager 用于与指定索引对应的页面。这不会发生,因为ViewPager 已经调用了getItem 方法来获取它需要的片段,并且在你调用getItem 方法之后你会得到一个新的ImageViewURLFragment 实例。这个新实例没有绑定到ActivitygetActivity() 返回null)并且它的视图没有被创建。

    当您使用FragmentStatePagerAdapter 时,请尝试以下代码以获取当前可见的Fragment

    if (item.getItemId()==R.id.saveToSD) {
         int index = _vp.getCurrentItem();
         Fragment fragment = _vp.getAdapter().instantiateItem(_vp, index);
         //...
    

    【讨论】:

    • 在搜索了更多信息后,我想问一下您是如何获得有关 instantiateItem 的信息的。我的意思是我已经读过这个适配器可以重用片段而不是每次都创建一个新片段,但是在哪里您是否找到我们可以直接调用 instantiateItem 并且这将返回片段的先前实例而不是新实例的信息?另一方面,您将如何为 PageView 执行此操作(获取当前项目)?提前致谢。
    • @Notbad 如果您查看FragmentStatePagerAdapter 的源代码,您会发现instantiateItem 方法将返回缓存片段或新片段。在您查找当前片段的情况下,它将是缓存版本。 另一方面,您将如何为 PageView 执行此操作(获取当前项目)? - 我不明白您在问什么。要从 FragmentStatePagerAdapter 获取当前片段,您可以使用答案中的代码。
    • 好的,谢谢。我认为为这类事情阅读 android 源代码是一种常见的做法。再次感谢您的回答。
    • 太棒了!感谢您提供我正在寻找的这一行。片段片段 = _vp.getAdapter().instantiateItem(_vp, index);
    • 即使超出了这个问题的范围也能正常工作。 :thumbup:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多