8

Я читал много о фрагментах. Обнаружили других людей, имеющих проблемы с извлечением фрагментов, потому что 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?

Заранее спасибо.

ответ

31

Так что мне нужно, чтобы получить текущий ImageView фрагмент, но я не могу, потому что fragment.getView() всегда равна нулю, активность, связанная с фрагмента нуль тоже, и я не могу понять, почему Это.

Это происходит потому, что вы ожидаете _iva.getItem(index); вернуть Fragment что ViewPager использует для страницы, соответствующей указанному индексу. Это не произойдет, поскольку ViewPager уже вызвал метод getItem, чтобы получить нужные ему фрагменты, а после вашего вызова getItem вы получите новый экземпляр ImageViewURLFragment. Этот новый экземпляр не привязан к Activity (getActivity() возвращает null), и его представление не было создано.

Как использовать FragmentStatePagerAdapter попробовать код, приведенный ниже, чтобы получить в настоящее время видны Fragment:

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

Спасибо большое за это. – Notbad

+0

После поиска дополнительной информации, я хотел бы спросить, как вы получили эту информацию о instantiateItem.I означает, что я прочитал, что этот адаптер может повторно использовать фрагменты вместо создания нового каждый раз, но где вы нашли информацию, которую мы могли бы call instantiateItem напрямую и что это вернет предыдущий экземпляр фрагмента, а не новый? А с другой стороны, как бы вы это сделали (получить текущий элемент) для PageView ?. Заранее спасибо. – Notbad

+1

@Notbad Если вы посмотрите на исходный код для «FragmentStatePagerAdapter», вы увидите, что метод 'instantiateItem' либо вернет кешированный фрагмент, либо новый фрагмент. В случае, если вы ищете текущий фрагмент, это будет кешированная версия. * А с другой стороны, как бы вы это сделали (получить текущий элемент) для PageView? * - Я не понимаю, о чем вы спрашиваете. Чтобы получить текущий фрагмент из FragmentStatePagerAdapter, вы должны использовать мой код из ответа. – Luksprog

 Смежные вопросы

  • Нет связанных вопросов^_^