我一直在阅读关于Fragment的内容。发现其他人遇到了检索Fragment视图时返回null的问题,但没有答案可以解决我的问题。我想要做的是创建一个图片库。我有一个包含图片视图的Fragment。为了显示这些Fragment,我使用了一个android.support.v4.view.ViewPager。而为了提供ViewPager,我使用了一个android.support.v4.app.FragmentStatePagerAdapter。
问题在于,当所有东西都构建好并且图片被显示时,我想要将当前显示的图片保存到磁盘上。所以我需要获取当前Fragment的ImageView,但我无法获取它,因为fragment.getView()总是返回null,与Fragment相关联的Activity也为null,我无法弄清楚为什么会这样。以下是一些代码,看看是否有人能够帮助:
这是我的Fragment:
问题在于,当所有东西都构建好并且图片被显示时,我想要将当前显示的图片保存到磁盘上。所以我需要获取当前Fragment的ImageView,但我无法获取它,因为fragment.getView()总是返回null,与Fragment相关联的Activity也为null,我无法弄清楚为什么会这样。以下是一些代码,看看是否有人能够帮助:
这是我的Fragment:
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);
}
}
抱歉这里的内容有些冗长,我已经尽可能清理了一切,但我想呈现所有的播放部分。有人能猜出正在发生什么吗?
提前感谢。
FragmentStatePagerAdapter
的源代码,你会发现instantiateItem
方法要么返回一个缓存的Fragment,要么返回一个新的Fragment。当你正在查找当前Fragment时,它将是缓存版本。而另一方面,你如何在PageView中实现这个(获取当前项目)?我不明白你在问什么。要从FragmentStatePagerAdapter中获取当前的Fragment,你可以使用我在答案中提供的代码。 - user