8

Wiele czytałem na temat fragmentów. Znalazłem innych ludzi mających problemy z odczytaniem fragmentów, ponieważ null zawsze był zwracany, ale żadna odpowiedź nie rozwiązała mojego problemu. Próbuję stworzyć galerię obrazów. Mam Fragment, który zawiera widok obrazu. Aby wyświetlić fragmenty, używam obiektu android.support.v4.view.ViewPager. I do zasilania ViewPager używam android.support.v4.app.FragmentStatePagerAdapter.Fragment getView() zawsze zwracający wartość null dla Fragmenty utworzone przez FragmentStatePagerAdapter

Problem polega na tym, że gdy wszystko jest zbudowane i wyświetlane są obrazy, chcę zapisać bieżący obraz na dysku. Potrzebuję uzyskać bieżący fragment obrazu, ale nie mogę, ponieważ fragment.getView() zawsze ma wartość NULL, aktywność związana z fragmentem również jest pusta i nie mogę się domyślić, dlaczego tak jest. Oto niektóre kod, aby sprawdzić, czy ktoś może pomóc tutaj:

To mój 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; 
    } 
} 

A to mój adapter:

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); 
    } 
} 

I to jest główna działalność, zauważy komentarz z otrzymanie:

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); 
    } 
} 

Przepraszam za długie źródła, wyczyściłem wszystko, co mogłem, ale chciałem wcześniej wysłał wszystkie części do gry. Czy ktokolwiek mógłby odgadnąć, co się dzieje?

Z góry dziękuję.

Odpowiedz

31

Więc muszę dostać bieżącego fragmentu ImageView ale nie mogę bo fragment.getView() zawsze jest null, działalność związana z fragmentu jest null zbyt i nie mogę zrozumieć, dlaczego jest to.

Tak się dzieje, ponieważ czekasz _iva.getItem(index); zwrócić Fragment że ViewPager używa na stronie odpowiadającej określonym indeksem. Tak się nie stanie, ponieważ ViewPager już nazwał metodę getItem, aby uzyskać potrzebne fragmenty, a po wywołaniu metody getItem otrzymujesz nową instancję ImageViewURLFragment. Ta nowa instancja nie jest powiązana z Activity (getActivity() zwraca null) i jej widok nie został utworzony.

Jak używać FragmentStatePagerAdapter wypróbować poniższy kod, aby uzyskać obecnie widoczne Fragment:

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

dziękuję za to. – Notbad

+0

Po wyszukaniu kilku dodatkowych informacji, chciałbym zapytać, skąd wzięły się te informacje o instantiateItem.I mam na myśli, że ten adapter może ponownie wykorzystać fragmenty zamiast tworzyć nowe za każdym razem, ale gdzie znalazłeś informacje, które moglibyśmy wywołać instantiateItem bezpośrednio i że zwróci to poprzednie wystąpienie fragmentu, a nie nowe? A z drugiej strony, jak by to zrobić (uzyskać bieżący element) dla PageView ?. Z góry dziękuję. – Notbad

+1

@Notbad Jeśli spojrzysz na kod źródłowy 'FragmentStatePagerAdapter' zobaczysz, że metoda' instantiateItem' zwróci buforowany fragment lub nowy fragment. W przypadku, gdy szukasz bieżącego fragmentu, będzie to wersja buforowana. * Z drugiej strony, jak by to zrobić (uzyskać bieżący element) dla PageView? * - Nie rozumiem, o co prosisz. Aby pobrać bieżący fragment z FragmentStatePagerAdapter, użyłbyś mojego kodu z odpowiedzi. – Luksprog

Powiązane problemy