2012-05-07 23 views
5

İki fragman içeren bir ViewPager uygulaması var: bir ana parça ve bir liste parçası. Listede bir şey seçilirse, etkinlikte ele alınan bir olay ortaya çıkar. Etkinlik ana parçaya geçer ve "setSelectedItem" yöntemini çağırır. Bu yöntemde, Ben seçilen öğeye göre metni değiştirmek için belirli bir görünümü bulmak için getView() kullanın.fragmanında getView döndürür bazen null

Çoğu zaman çalışır, ancak bazen getView null değerini döndürür ve nedenini bilmiyorum.

pagerAdapter aktivitesinin OnCreate oluşturulur: Bu adlandırılır aktivitesi olan metod olup,

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    this.main = MainFragment.newInstance(); 
    this.list = ListFragment.newInstance(); 
} 

:

this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager()); 
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setAdapter(this.mPagerAdapter); 

çağrı adaptörünün yapıcısında her iki parçanın da örneklerini oluşturur

ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

Ve nihayet inci: listeden bir öğe seçildiğinde Sorun hala düzensiz oluşur ben okudum ama birkaç şey denedik

TextView s = (TextView)getView().findViewById(R.id.CurrentSelection); 

: soruna neden MainFragment içinde setSelectedItem yönteminde hat olmasıdır.

+0

Ne yazık ki bende aynı sorun var ve çözünürlük yok. Benim kodumda (getView() == null) varsa; çeşitli yerlerde. Sorunu şimdiye kadar çözdüyseniz, ilgilenirim. – StackOverflowed

+2

Parçayı parçalara ayırıcıya eklediğiniz kodu paylaşabilir misiniz? Eğer fragman için onCreateView (fragman yaşam döngüsünün bir kısmı) çağrılmamışsa getView, null değerini döndürecektir. Yani, parça, aktiviteye tamamen eklenmemiştir. – PacificSky

+0

"TextView s" yi nerede arıyorsun? Bu, Fragman'da genel görünümde GetView var mı? –

cevap

0

Başlamak için,% 100 emin değilim, ama bahsetmem gereken birkaç nokta var. İlk olarak, this ve super'u nasıl kullandığınızı beğenmedim, belirsiz görünüyorlar, onların değerlerinin farkında olmanız için ön derleme yapmanın daha doğru bir yol olduğuna inanıyorum. Eğer kodunuzu aşağıdaki gibi değiştirirseniz, yardımcı olur (sadece bir önsez).

// Here use 'getActivity()' instead of 'getView()' 
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection); 

bana ne olur biliyor Let

// No need for 'super' here, you are within the activity 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 



public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    // No need for 'this' here, you are within the class 
    main = MainFragment.newInstance(); 
    list = ListFragment.newInstance(); 
} 

// No need for 'this' and 'super' here, you are within the activity 
mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setAdapter(mPagerAdapter); 
, şerefe.

+0

'a bağlı olarak ele almadım. Konu çok eski ve hala kabul edilmiş bir yanıt değil.Aynı sorunu ele alıyor ve bir çözüm arıyor. Önemli bir uyarı: sorun yeniden android, hosting etkinliğini (örneğin memede) öldürdüğünde .Android bu durumda aktiviteyi yeniden başlatmaya çalışır.OnCreateView bir sebepten dolayı, daha önce çağrılan (!) Yerine parça rekreasyonundan sonra çağrılmamaktadır.İnsanı, "geliştirici seçenekleri" nde kullanıcı bıraktığı anda her faaliyeti yok edebilecek şekilde ayarlayabiliriz. Ana sayfa düğmesine basarak uygulamayı açın ve geri yükleyin. – undefined

İlgili konular