SORU
15 Mart 2012, PERŞEMBE


destek FragmentPagerAdapter eski parçaları için başvuru içerir

SON BİLGİ:

bu fragmentManager eski parçaları örneklerini koruyarak ve benim viewpager senkronize benim FragmentManager birlikte olmak ile ilgili bir sorun olduğun benim sorunum daralmış var. Bu sorunu... http://code.google.com/p/android/issues/detail?id=19211#makechanges bkz . Ben hala bu sorunu çözmek için nasıl hiçbir ipucu var. Herhangi bir öneri...

Uzun zamandır bu hata ayıklama için denedim ve herhangi bir yardım büyük mutluluk duyacağız. Yani parçaları bir listesini kabul eden bir FragmentPagerAdapter kullanıyorum:

List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName())); 
...
new PagerAdapter(getSupportFragmentManager(), fragments);

Uygulama standardıdır. Parçaları için ActionBarSherlock ve v4 hesaplanabilirlik kütüphane kullanıyorum.

Benim sorunum uygulama ve diğer bazı uygulamaları terk açma ve geri geldikten sonra parçaları tekrar kendi referans FragmentActivity (yani. kaybedecek olmasıdır getActivity() == null). Bu neden oluyor anlayamıyorum. El ile setRetainInstance(true); set denedim ama hiç bir faydası yok. Bu benim FragmentActivity yok olunca, ancak bu yine de eğer günlük mesaj aldım önce uygulamayı açarsam olur olur diye düşündüm. Herhangi bir fikir var mı?

@Override
protected void onDestroy(){
    Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
    super.onDestroy();
}

Adaptör:

public class PagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments;

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);

        this.fragments = fragments;

    }

    @Override
    public Fragment getItem(int position) {

        return this.fragments.get(position);

    }

    @Override
    public int getCount() {

        return this.fragments.size();

    }

}

Benim parçalardan biri elimden ama bu elimden everyhting ben commetned ve hala çalışmıyor...

public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener {
...

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    handler = new Handler();    
    setHasOptionsMenu(true);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.w(TAG,"ATTACHATTACHATTACHATTACHATTACH");
    context = activity;
    if(context== null){
        Log.e("IS NULL", "NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL");
    }else{
        Log.d("IS NOT NULL", "NOTNOTNOTNOTNOTNOTNOTNOT");
    }

}

@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.my_fragment,container, false);

    return v;
}


@Override
public void onResume(){
    super.onResume();
}

private void callService(){
    // do not call another service is already running
    if(startLoad || !canSet) return;
    // set flag
    startLoad = true;
    canSet = false;
    // show the bottom spinner
    addFooter();
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra(MyService.STATUS_RECEIVER, resultReceiver);
    context.startService(intent);
}

private ResultReceiver resultReceiver = new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, final Bundle resultData) {
        boolean isSet = false;
        if(resultData!=null)
        if(resultData.containsKey(MyService.STATUS_FINISHED_GET)){
            if(resultData.getBoolean(MyService.STATUS_FINISHED_GET)){
                removeFooter();
                startLoad = false;
                isSet = true;
            }
        }

        switch(resultCode){
        case MyService.STATUS_FINISHED: 
            stopSpinning();
            break;
        case SyncService.STATUS_RUNNING:
            break;
        case SyncService.STATUS_ERROR:
            break;
        }
    }
};

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.activity, menu);
}

@Override
public void onPause(){
    super.onPause();
}

public void onScroll(AbsListView arg0, int firstVisible, int visibleCount, int totalCount) {
    boolean loadMore = /* maybe add a padding */
        firstVisible   visibleCount >= totalCount;

    boolean away = firstVisible  visibleCount <= totalCount - visibleCount;

    if(away){
        // startLoad can now be set again
        canSet = true;
    }

    if(loadMore) 

}

public void onScrollStateChanged(AbsListView arg0, int state) {
    switch(state){
    case OnScrollListener.SCROLL_STATE_FLING: 
        adapter.setLoad(false); 
        lastState = OnScrollListener.SCROLL_STATE_FLING;
        break;
    case OnScrollListener.SCROLL_STATE_IDLE: 
        adapter.setLoad(true);
        if(lastState == SCROLL_STATE_FLING){
            // load the images on screen
        }

        lastState = OnScrollListener.SCROLL_STATE_IDLE;
        break;
    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
        adapter.setLoad(true);
        if(lastState == SCROLL_STATE_FLING){
            // load the images on screen
        }

        lastState = OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
        break;
    }
}

@Override
public void onDetach(){
    super.onDetach();
    if(this.adapter!=null)
        this.adapter.clearContext();

    Log.w(TAG, "DETACHEDDETACHEDDETACHEDDETACHEDDETACHEDDETACHED");
}

public void update(final int id, String name) {
    if(name!=null){
        getActivity().getSupportActionBar().setTitle(name);
    }

}

}

Update yöntemi bir kullanıcı farklı bir parça ile etkileşime girer ve getActivity boş dönüyor denir. Burada diğer parçasını arıyor yöntemi...

((MyFragment) pagerAdapter.getItem(1)).update(id, name);

App özelleştirmeler, yeniden oluşturulan yerine sadece app başlatıldığında varsayılan parça ve viewpager sonra başlayan, bilinen en son sayfaya gider inanıyorum. Bu garip görünüyor, app sadece varsayılan parça yük gerekmez mi?

CEVAP
16 Mart 2012, Cuma


Ve PagerAdapter.getItem dışında parçaları için başvurular başlatmasını tutuyor, çünkü bu bir sorun haline çalışan ve bu başvurular ViewPager bağımsız olarak kullanmaya çalışıyorlar. Seraph dediği gibi, bir parça/belirli bir zamanda bir ViewPager örneği eklenmiş olduğunu garanti eder - bu uygulama ayrıntı düşünülmelidir. Bir ViewPager sayfalarının tembel yükleme yapar; varsayılan olarak, yalnızca geçerli sayfa yükler, ve sol ve sağ.

Eğer arka planda app koyarsanız, parça yöneticisi eklenen parçaları otomatik olarak kaydedilir. Eğer app öldürülse bile, bu bilgileri uygulamayı yeniden başlatın zaman geri yüklenir.

Şimdi bir kaç sayfa olduğunu düşünün, Parçaları, bu bölümü yöneticisi eklenen biliyorsun B ve C. FragmentPagerAdapter 14**, kullanmıyorsunuzdur çünkü bu parçalar hala diğer sayfalara kaydırma eklendi (ama potansiyel olarak müstakil) olacaktır.

Daha sonra uygulamanıza arka plan düşünün ve sonra da öldürür. Geri döndüğünde, Android oluşmaması için kullanılan hatırlar A, B ve C bölümü yöneticisi ve sizin için onları yeniden oluşturur ve sonra bunları ekler.Ancak, parça yöneticisi eklendi olanlar şimdi aktivitede parçaları listesi var olanları DEĞİL.

Bu FragmentPagerAdapter eğer zaten bir parçası, belirli bir sayfa pozisyon için eklenir varsa getPosition çağrı denemez. Parçanın Android tarafından yeniden asla kaldırılacaktır hatta getPosition bir çağrı ile yerine hiç umut var. Bu işi almak için bilinmeyen bir etiket eklendi, çünkü aynı zamanda çok zor bir başvuru almak için. Bu tasarım gereği, görünüm çağrı yönetme parçaları karıştırmayı önerilmez. Gerekirse bir parça içinde tüm eylemleri gerçekleştirmek, bu aktivite ile iletişim, ve belirli bir sayfaya geçiş yapmak isteyen olmalıdır.

Şimdi, kayıp aktivite ile sorunun geri. Tüm bu olanlardan sonra pagerAdapter.getItem(1)).update(id, name) arama listesinde, parça verirhenüz bölümü yöneticisi eklenecek olanEtkinliği bir referans olacaktır o yüzden. Güncelleme yöntemi bazı paylaşılan veri yapısını değiştirmek gerektiğini öneririm (muhtemelen faaliyetleri tarafından yönetilen) ve sonra belirli bir sayfaya gittiğinizde, bu güncelleştirilmiş verilere dayanarak kendisi çizebiliyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • Erica Griffin

    Erica Griffi

    8 HAZİRAN 2009
  • Jason Parker

    Jason Parker

    14 Aralık 2009