SORU
4 Mayıs 2012, Cuma


Parçaları gerçekten boş bir yapıcı gerekiyor mu?

Birden fazla bağımsız değişken ile bir Kurucu bir parçası var, her şey iyi deneme aşamasındadır boyunca çalıştı ama şimdi yaklaşık 300 kullanıcıların uygulamayı indirdikten sonra, o özel BİR durum var:

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment 
make sure class name exists, is public, and has an empty constructor that is public

Farklı bir Oluşturucu sağlar alabilirdim ama o zaman başka bir yöntem gerçekten Parça ayarlamak için aramam gerekir beri çok fazla anlam ifade etmiyor.

Tüm parçaları kendim oluşturmak ve bir liste içine kaydedin faaliyet içinde çünkü bu ara sıra oluyor neden merak ediyorum ve her zaman ve belki de Parçalanmış Viewpager kullanarak sadece yanlış değil im,. Parçalanmış Viewpager ile ilgili örnek, her şey iyi çalıştı sonunda bu konuda çok net değildi çünkü FragmentManager hareket şeyler kullanmıyorum.

CEVAP
4 Mayıs 2012, Cuma


Evet var.

Zaten kurucu öncelikli olmamalı. newInstance() statik bir yöntem tanımlanmış ve argümanlar üzerinden herhangi bir parametre (bundle) geçmesi

Örneğin:

public static final AlertFragment newInstance(int title, String message)
{
    AlertFragment f = new AlertFragment();
    Bundle bdl = new Bundle(2);
    bdl.putInt(EXTRA_TITLE, title);
    bdl.putString(EXTRA_MESSAGE, message);
    f.setArguments(bdl);
    return f;
}

Ve tabii ki argümanlar bu şekilde yakalamak:

@Override
public void onCreate(Bundle savedInstanceState)
{
    title = getArguments().getInt(EXTRA_TITLE);
    message = getArguments().getString(EXTRA_MESSAGE);

    //...
    //etc
    //...
}

Sonra parça Yöneticisinden gibi çok başlatılamadı:

public onCreate(Bundle savedInstanceState) {
    if(savedInstanceState == null){
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content,AlertFragment.newInstance(
                R.string.alert_title,
                "Oh noes an error occured!")
            )
            .commit();
    }
}

Bu şekilde, eğer müstakil ve re-bağlı nesne durumu bağımsız değişkenleri ile saklanabilir. Demetleri Niyet bağlı gibi.

Neden Fazladan okuma

Neden insanlar neden merak edenler için açıklamak istedim.

Eğer denetleyin: https://android.googlesource.com/platform/frameworks/support/ /refs/heads/master/v4/java/android/support/v4/app/Fragment.java

Fragment sınıfta aramalar newInstance yöntemi instantiate(..) yöntemi göreceksiniz. http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance(), örnekleme üzerine erişimci public olduğunu ve bu sınıf yükleyici erişimi sağlayan denetler Açıklıyor.

Sonuçta çok kötü bir yöntem, ama FragmentManger öldürüp Birleşik Devletleri Fragments yeniden sağlar. (Android alt sistemi Activities) ile benzer şeyler yapıyor.

Örnek Sınıf

newInstance, arama hakkında çok sorulan(sınıf yöntemi ile karıştırmayın. Bütün sınıf örnek kullanımını gösterir.

/**
 * Created by chris on 21/11/2013
 */
public class StationInfoAccessibilityFragment extends BaseFragment implements JourneyProviderListener {

    public static final StationInfoAccessibilityFragment newInstance(String crsCode) {
        StationInfoAccessibilityFragment fragment = new StationInfoAccessibilityFragment();

        final Bundle args = new Bundle(1);
        args.putString(EXTRA_CRS_CODE, crsCode);
        fragment.setArguments(args);

        return fragment;
    }

    // Views
    LinearLayout mLinearLayout;

    /**
     * Layout Inflater
     */
    private LayoutInflater mInflater;
    /**
     * Station Crs Code
     */
    private String mCrsCode;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mCrsCode = getArguments().getString(EXTRA_CRS_CODE);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mInflater = inflater;
        return inflater.inflate(R.layout.fragment_station_accessibility, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mLinearLayout = (LinearLayout)view.findViewBy(R.id.station_info_accessibility_linear);
        //Do stuff
    }

    @Override
    public void onResume() {
        super.onResume();
        getActivity().getSupportActionBar().setTitle(R.string.station_info_access_mobility_title);
    }

    // Other methods etc...
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • MovieZoneET

    MovieZoneET

    22 Aralık 2009