Я читал много о фрагментах. Обнаружили других людей, имеющих проблемы с извлечением фрагментов, потому что null всегда возвращался, но ответ не разрешил мою проблему. Я пытаюсь создать галерею изображений. У меня есть фрагмент, который содержит изображение. Чтобы показать фрагменты, я использую android.support.v4.view.ViewPager. И для подачи ViewPager
я использую android.support.v4.app.FragmentStatePagerAdapter
.Фрагмент getView() всегда возвращает null для фрагментов, созданных FragmentStatePagerAdapter
Проблема заключается в том, что когда все создается и отображаются изображения, я хочу сохранить текущее отображаемое изображение на диск. Поэтому мне нужно получить текущее изображение фрагмента, но я не могу, потому что instance.getView() всегда имеет значение null, активность, связанная с фрагментом, тоже нулевая, и я не могу понять, почему это так. Здесь какой-то код, чтобы увидеть, если кто-то может помочь здесь:
Это мой фрагмент:
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);
}
}
И это является основным видом деятельности, обратите внимание на комментарий с получить:
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);
}
}
Извините за длинные источники, я очистил все, что мог, но я хотел предварительно отправил все игровые части. Может ли кто-нибудь угадать, что такое hapenning?
Заранее спасибо.
Спасибо большое за это. – Notbad
После поиска дополнительной информации, я хотел бы спросить, как вы получили эту информацию о instantiateItem.I означает, что я прочитал, что этот адаптер может повторно использовать фрагменты вместо создания нового каждый раз, но где вы нашли информацию, которую мы могли бы call instantiateItem напрямую и что это вернет предыдущий экземпляр фрагмента, а не новый? А с другой стороны, как бы вы это сделали (получить текущий элемент) для PageView ?. Заранее спасибо. – Notbad
@Notbad Если вы посмотрите на исходный код для «FragmentStatePagerAdapter», вы увидите, что метод 'instantiateItem' либо вернет кешированный фрагмент, либо новый фрагмент. В случае, если вы ищете текущий фрагмент, это будет кешированная версия. * А с другой стороны, как бы вы это сделали (получить текущий элемент) для PageView? * - Я не понимаю, о чем вы спрашиваете. Чтобы получить текущий фрагмент из FragmentStatePagerAdapter, вы должны использовать мой код из ответа. – Luksprog