Android'de Görünümler yerine Fragmanları kullanmanın faydası nedir?


102

İçin geliştirme yaparken Android, hedef (veya minimum) sdk'nizi 4 (API 1.6) olarak ayarlayabilir ve destek eklemek için android uyumluluk paketini (v4) ekleyebilirsiniz Fragments. Dün bunu yaptım ve Fragmentsözel bir sınıftaki verileri görselleştirmek için başarıyla uyguladım .

Sorum şu: FragmentsÖzel bir nesneden yalnızca bir Görünüm almak ve API 1.5'i desteklemeye devam etmek yerine kullanmanın faydası nedir?

Örneğin, Foo.java sınıfına sahip olduğumu varsayalım:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Her iki yöntemin de oluşturulması ve gösterilmesi gereken bir Aktivitede çalışmak çok basittir List<Foo>(örneğin, her birini a'ya programlı olarak eklemek ScrollView), bu yüzden Fragmentsgerçekten yararlıdırlar mı yoksa yalnızca Yukarıdaki kod aracılığıyla olduğu gibi bir Görünüm elde ediyor musunuz?


2
Parçaların bir kullanıcı arayüzüne sahip olması gerekmez, sadece yeniden kullanılabilir davranış olabilirler. Bu durumda bir Görünüm gereksiz olacaktır.
Philipp Reichart

Bunu başka bir soruda cevapladım. Stackoverflow.com/a/14912608/909956 T'ye bakın ; dr - bazen parçalar, özel görünüm uygulamasına güvenmekten daha fazla yeniden kullanılabilir bileşen oluşturmanıza olanak tanır. nedenini görmek için bağlantıya bakın.
numan salati

Yanıtlar:


172

Fragments'ı kullanmanın ana nedeni, arka yığın ve yaşam döngüsü özellikleridir. Aksi takdirde, özel görünümler daha hafiftir ve uygulaması daha kolaydır.

İlk başta, özel görünümleri kullanarak bir telefon / tablet uygulaması oluşturmaya çalıştım. Her şey telefonlarda VE tabletlerde çalışıyor gibi görünüyordu , hatta tek panelden bölünmüş panele geçiliyordu. Başım belaya girdiğim yer geri düğmesi ve yaşam döngüsüydü. Görünümleri sadece manuel olarak güncellediğim için ... görünümlerin geçmişini ve durumlarını takip eden hiçbir şey yoktu. Bu nedenle, geri düğmesi beklendiği gibi çalışmadı ve uygulamayı döndürme gibi yaşam döngüsü olayları sırasında en son durumu bile yeniden oluşturmak zordu. Bunu düzeltmek için, özel görünümlerimi parçalara ayırmam ve FragmentManager'ı kullanmam gerekiyordu, böylece önceki durumlar kaydedilip yeniden oluşturulabilecekti.

Bir yıl önce benzer bir soru yayınladığımı yanıtladıktan sonra fark ettim: https://stackoverflow.com/a/11126397/618881


14
Çok güzel cevap. Parçaların 4.2 veya destek kütüphanesi rev 11'den beri yuvalanabileceğini eklemek istedim.
Kar

2
Güncelleme için @Karlo'ya teşekkürler. Kavramsal olarak mümkün olduğunu düşünmedim, ancak getChildFragmentManager () aracılığıyla özel bir FragmentManager kullanarak bunun etrafında çalıştılar. Oh, ve API 17, 11 değil ve Destek Kitaplığı'ndan edinilebilir.
Henry

2
Bu soruya tekrar bakıyordum ve deneyimim de değişti. Bu, hem faydaların hem de dezavantajların iyi anlaşılmasını sağlayan ve çok yardımcı olan bir cevaptır. Teşekkürler!
Phil

2
Bu yanıtı + 1'lemek ister, ancak bunu yapmak mevcut puanı mahveder. Ayrıca 70 benim favori numaram değil.
Behnam

1
geçen yıl, Fragments'ın ekstra sıradan bir özellik sağlamadığını da düşünüyordum, ancak aktiviteye geri tıkladıktan sonra indirilen tüm görüntüleri kaybettiğimi deneyimledim, bu yüzden önbellek uygulamasını eklemek zorunda kaldım, şimdi kullanmayı düşünüyorum parçalar çok kolay olabilir
Shirish Herwade 09

27

Parçaların iki senaryoda yararlı olduğunu söyleyebilirim: Bazı cihazlarda / yönlerde görünümleri bölerseniz ve bunları iki etkinlikte gösterirseniz ve tüm içeriği diğer cihazlarda bir arada gösterirseniz. Bir tablete veya hatta bir telefonda yatay modda giderseniz bu bir kullanım durumu olacaktır: örneğin, öğelerin listesini ve ayrıntıları bir ekranda gösterirsiniz. bir telefonda veya portre modunda sadece bir parçayı gösterirsiniz.

Başka bir kullanım durumu, yeniden kullanılabilir görünümlerdir. Dolayısıyla, farklı faaliyetlerde görünen bazı görüşleriniz varsa ve aynı zamanda bazı eylemler gerçekleştiriyorsanız, bu davranışı bir parçaya koyabilir ve sonra yeniden kullanabilirsiniz. Açıkçası, bunu muhtemelen özel widget'larla da yapabilirsiniz.

Her Görünüm için Fragment kullanmak için herhangi bir neden görmüyorum ve sanırım bu sadece bir ek yük olurdu. Bunları sadece ilk kullanım durumunda kullanıyorum ve burada bunun bir basitleştirme olduğunu söyleyebilirim.


Teşekkürler, bu kesinlikle yardımcı oldu. Sanırım görüşlere bağlı kalacağım ve onları yeniden kullanılabilir hale getirmek için kendi 'arka yığımı' yapacağım.
Phil

3

Android, öncelikle tabletler gibi büyük ekranlarda daha dinamik ve esnek UI tasarımlarını desteklemek için Android 3.0'da (API seviyesi 11) fragmanlar sundu. Bir tabletin ekranı bir el cihazından çok daha büyük olduğu için, UI bileşenlerini birleştirmek ve değiştirmek için daha fazla alan vardır. Parçalar, görünüm hiyerarşisindeki karmaşık değişiklikleri yönetmenize gerek kalmadan bu tür tasarımlara izin verir. Bir etkinliğin düzenini parçalara bölerek, etkinliğin görünümünü çalışma zamanında değiştirebilir ve bu değişiklikleri etkinlik tarafından yönetilen bir arka yığında koruyabilirsiniz.

Burada daha fazlasını okuyabilirsiniz.


Tüm belgeleri okudum, ancak tabletler veya arka yığınlar gibi avantajlarını daha iyi açıklayan bir şey arıyordum
Phil

3
  1. Senaryo Etkinlik Bölünmüş ekranı - Bir Düzen ve sol sağ ekran bölümünü işleyen bir etkinliğimiz var
  2. Senaryo FragmentActivity Ana ekran için bir düzenimiz var, bir tane sol için bir tane sağ için

Basit uygulamanız varsa birinci senaryo iyidir.

Birden Çok Fragman ve birden fazla FragmentActiviteye sahip olmak istiyorsanız ikinci senaryo iyidir ve bunların her birini birleştirebilirsiniz. Ayrıca parçalar arasında etkileşim kurabilirsiniz.

Bölünmüş ekran Fragmentactivity'ye sahibim, 'Intent Extras' ile çağırabilir ve fragmentActivity'ye hangi parçanın yükleneceğini söyleyebilirim. Parçalar iyidir çünkü tezahür etmezler, bu yüzden yeniden kullanılabilir parçalar ve FragmentActvity yapabilirsiniz.

Ama projenizi büyütür. Ama büyük bir proje yaparsanız, çok şey kurtarabilirsiniz. Çünkü aynı Fragmanları veya aynı Fragment aktivitesini kullanabilirsiniz.

Ve sanırım bu parçalar biraz geç geldi, bu yüzden yeni bir şekilde düşünmeye çalışmalısınız. Belki sadece aktivitenizi FragmentActivity'ye dönüştürmeyi deneyin. Daha sonra yeniden kullanılabilir kodu bulmaya çalışın ve ondan Fragment yapın.

Faydalı ama şu anda nasıl olduğunu bilmiyorum. Ama bazı fikirlerim var.

Bu her zaman problemdir. Android Ekibi bir şeyler düşündü ve kimse neyin iyi olduğunu bilmedi. Çünkü eskisi gibi pek öğrenemiyoruz ve işte yeni şeyler geliyor.

Bence bu iyi ama google'ın bize söylemesinin nedeni değil.


0

CustomView üzerinden Parça veya Etkinlik kullanırken bir durum ekleyin:

Belirli görünümleri, ListView veya TextView'ı gözlemlemek için CursorLoader'ı kullandığınızda ve ContentProvider'ınızın arka uçta veri güncellendiğinde görüntü değerlerini güncellemek istediğinizde (en yaygın durumda, uzak veritabanından / buluttan verileri düzenli olarak sorgulayarak yerel veritabanınızı güncelleyen bir hizmetiniz vardır. )


-2

Yukarıdaki tüm yorumların bahsetmediği büyük bir şey, Android etkinliği sonlandırsa ve cihazınızın yönünü değiştirmek gibi bir şey yaptığınızda onu yeniden başlatsa bile bir parçanın bellekte yerleşik kalmasıdır. Bu, performans nedenleriyle yapılır, ancak parçaların yalnızca hiçbir yerden yeniden oluşturulduğunu bulmak için yok edilmesini bekliyorsanız, beklenmedik sonuçlara da yol açabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.