8

Parçalar hakkında çok şey okudum. Fragmanları görüntülemede sorun yaşayan başka insanlar bulmuşlardır, çünkü null her zaman geri döndü, fakat cevabım sorunumu çözmedi. Yapmaya çalıştığım bir resim galerisi oluşturmak. Resim görünümünde bir Parçam var. Fragmanı göstermek için bir android.support.v4.view.ViewPager kullanıyorum. Ve ViewPager'u beslemek için android.support.v4.app.FragmentStatePagerAdapter kullanıyorum.Parça getView() her zaman FragmentStatePagerAdapter tarafından oluşturulan Fragments için null değerini döndürüyor

Sorun şu ki, her şey oluşturulduğunda ve resimler gösterildiğinde mevcut gösterilen görüntüyü diske kaydetmek istiyorum. Bu yüzden, şimdiki fragman görüntüsü görüntüsünü almam gerekiyor ama yapamıyorum çünkü fragment.getView() her zaman boş, parçayla ilişkili etkinlik de boş ve neden olduğunu anlayamıyorum. Bu

benim Fragment geçerli::

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

Ve bu benim adaptör: kimse burada yardımcı olabilir İşte bazı kod görmeye

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

Ve bu ana faaliyettir ile yorumunu fark 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); 
    } 
} 

Uzun kaynaklardan dolayı özür dilerim, elimden geleni yaptım, ama önceden yapmak istedim tüm oyun parçalarını yolladı. Hapenning'in ne olduğunu tahmin eden var mı?

Şimdiden teşekkürler.

cevap

31

yüzden şimdiki parçası ImageView almak gerekir ama yapamam çünkü fragment.getView() her zaman null, fragmanı ile ilişkili aktivite çok null ve neden ben çözemiyorum o. Eğer ViewPager belirtilen dizine karşılık gelen sayfa için kullandığı Fragment dönmek için _iva.getItem(index); bekliyoruz çünkü oluyor

. Bu ViewPager zaten ihtiyacı olan parçaları almak için getItem yöntemini çağırdı ve yöntemi yeni bir ImageViewURLFragment örneğini almak gibi bir yöntem olmayacaktır. Bu yeni örnek, Activity (getActivity(), null döndürür) bağlı değildir ve görünümü oluşturulmamıştır.

Bir FragmentStatePagerAdapterFragment anda görünür almak için aşağıdaki kodu deneyin kullanıldıkça:

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

Teşekkür bunun için çok. – Notbad

+0

Daha fazla bilgi için arama yaptıktan sonra, bu bilginin nasıl elde edildiğini sormak istiyorum. Bu adaptörün her seferinde yeni bir tane oluşturmak yerine fragmanları yeniden kullanabileceğini okumuştum ama nereden bulabileceğimizi nereden öğrendiniz? örneği doğrudan arayın ve bunun parçanın önceki bir örneğini döndüreceğini ve yeni bir tane döndürmeyeceğini? Ve öte yandan bunu nasıl yaparsınız (mevcut öğeyi) PageView için. Şimdiden teşekkürler. – Notbad

+1

@Notbad "FragmentStatePagerAdapter" için kaynak koduna bakarsanız, "instantiateItem" yönteminin önbelleğe alınmış bir parçayı veya yeni bir parçayı döndüreceğini görürsünüz. Mevcut parçayı ararken, önbelleklenmiş versiyon olacaktır. * Ve öte yandan bunu nasıl yapardın (şimdiki öğeyi) bir PageView için? * - Ne istediğini anlamıyorum. Geçerli parçayı bir FragmentStatePagerAdapter'den almak için kodumu cevaptan kullanırdım. – Luksprog

İlgili konular