Fragmanlara Karşı Kaç Etkinlik Var?


185

tanıtım:

Temel "Parça Öğreticisi" modeli şu şekildedir:

  1. Tablette, solda, sağda ayrıntılar içeren bir liste bulundurun.
  2. Her Fragmentsikisi de aynıdır Activity.
  3. Telefonda bir listede bir liste Fragmentbulun Activity.
  4. ActivityAyrıntılar ile yeni bir tane başlatın Fragment.

(ör . Dianne Hackborn tarafından Android 3.0 Fragments API ve Fragments API Guide )

Her iki cihazda da işlevsellik Fragments. (basit)

On Tablet , tüm uygulama 1Activity tarihinde, telefonda vardır birçokActivities .


Sorular:

  • Telefon uygulamasını birçok kişiye bölmenin bir nedeni var mı Activities?

Bu yöntemle ilgili bir sorun , ana Tablette ve ayrı Telefonda mantığın çoğunu çoğaltmanızdır .ActivityActivities

  • Her iki durumda da 1 Etkinlik modelini tutmak ve aynı anahtarlama mantığını Fragmentskullanarak (sadece farklı bir düzen kullanarak) daha kolay olmaz mıydı?

Bu şekilde mantığın çoğu Fragmentskendi içlerinde bulunur ve Activitykodun tek bir daha az çoğaltılması vardır.

Ayrıca hakkında okudum ne yerine ActionBarSherlockile en iyi çalışmak gibi görünüyor (ama ben henüz onunla çalışmadım).FragmentsActivities

Eğiticiler aşırı basitleştirilmiş mi, yoksa bu yaklaşımda önemli bir şeyi kaçırdım mı?


Her iki yaklaşımı da ofiste başarıyla denedik - ama daha büyük bir projeye başlamak üzereyim ve işleri kendim için olabildiğince kolaylaştırmak istiyorum.

İlgili sorulara bazı bağlantılar:


Güncellemeler

Söz konusu ödül kazanmaya başladı - hala tablet etkinliğimde ve her telefon etkinliğinde uygulama mantığımı neden çoğaltmam gerektiğine ikna olmadım.

Ayrıca Square'de çocuklar tarafından okunmaya değer ilginç bir makale bulundu:


38
Harika ve iyi yazılmış bir soru için +1.
Siddharth Lele

bu gün bana çok acı veren bir şey, şu anda tasarım çok fazla parça içeren bir uygulama üzerinde çalışıyorum ve hem telefon hem de tablette mevcut olacak, orta bir yol arıyorum, ancak henüz bulamadım ...
Nixit Patel

1
Dürüst olmak gerekirse suç demek istemiyorum ama bence gerçek cevaptan ziyade duymak istediklerini kabul ettin. Scuba'nın cevabı Google ve nedenini açıklamayı sevdiğim blog yazısı tarafından önerilmez.
pjco

1
@pjco Özellikle onItemSelected()Faaliyette yöntem sahibi olmama katılmıyorum . Benim "gerçek" app, birçok liste ve alt listeler var. Bu kalıp, Sekme Etkinliğimin onItemSelected()listelerin her birini işlemek için bir yöntemi olması gerektiğini önerir . Ayrıca, Telefon Etkinlikleri'nin her birinde aynı mantığın her biri içinde kopyalanmış olmalıdır. IMHO her bir parçaya öğe seçilen mantık koymak çok daha iyidir - çoğaltma yoktur ve ben kodu yapılandırmak için bu şekilde tercih ederim. Umarım bu yardımcı olur
Richard Le Mesurier

2
Şu anda işte bu ikileme kapılıyorum. Parçalar yeni aktiviteler başlatmaktan çok daha hızlı yükleniyor, bu yüzden tek bir aktivite mimarisi uygulamaya başladım. Yine de bir sorunla karşılaştım, yani hacky bir şey yapmadan çok parçalı yapılandırmaları desteklemek için iyi bir yol bulamıyorum. Bu soruya bakın .
theblang

Yanıtlar:


41

Eğiticilerin çok basitleştirildiğini kabul ediyorum. Onlar sadece tanıtmak Fragmentsama önerilen desen kabul etmiyorum.

Ayrıca, uygulamanızın mantığını birçok Etkinlik arasında çoğaltmanın iyi bir fikir olmadığını kabul ediyorum (bkz . Wikipedia'da KURU Prensibi ).


ActionBarSherlockFragments Demo uygulaması tarafından kullanılan kalıbı tercih ediyorum ( buradan indirin ve kaynak kodu buradan ). Soruda belirtilen öğretici ile en yakından eşleşen demo uygulamada "Düzen" olarak adlandırılan; veya FragmentLayoutSupportkaynak kodunda.

Bu demoda, mantık Activityve işaretinin dışına taşındı Fragment. TitlesFragmentAslında Fragments değiştirmek için mantığı içerir. Bu şekilde, her Etkinlik çok basittir. Mantıkların hiçbirinin Faaliyetler içinde olmadığı çok basit Faaliyetleri çoğaltmak çok basit hale getirir.

Mantığı Parçalara koyarak, kodu bir kereden fazla yazmaya gerek yoktur ; Parçanın hangi Etkinliğe yerleştirildiğine bakılmaksızın kullanılabilir. Bu, onu temel öğreticinin önerdiğinden daha güçlü bir model yapar.

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

ABS modelinin bir başka avantajı, çok fazla mantık içeren bir Tablet Etkinliği ile sonuçlanmamanızdır ve bu da bellek tasarrufu yaptığınız anlamına gelir. Öğretici model, daha karmaşık bir uygulamada çok büyük bir ana etkinliğe yol açabilir; çünkü herhangi bir zamanda içine yerleştirilen tüm parçaların mantığını işlemesi gerekir.

Genel olarak, bunun birçok etkinliği kullanmaya zorlandığını düşünmeyin. Kodunuzu birçok parçaya bölme ve bunları kullanırken bellek tasarrufu yapma fırsatı olduğunu düşünün.


kapsamlı cevap için thx - ABS demolarına baktım ve orada çok iyi kod olduğunu düşünüyorum. Bunun yerine mantığımın çoğunu Fragmanlara taşımaya çalışacağım
Richard Le Mesurier

Demo Uygulaması buraya taşındı: play.google.com/store/apps/…
Philipp E.

Açıkladığınız modelin orijinal Google örnek kodundan olduğunu düşünüyorum : android-developers.blogspot.com/2011/02/… Sanırım ActionBarSherlock, ABS sınıflarını kullanmak için Google demo kodunu taşıdı.
Dan J

17

Bence doğru yoldasın. (Ve evet, öğreticiler aşırı basitleştirilmiştir).

Bir tablet düzeninde, tek bir Etkinlik kullanabilir ve Parçaları içeri ve dışarı takas edebilirsiniz (birden çok 'bölmede'). Bir telefon düzenindeyken her Parça için yeni bir Etkinlik kullanabilirsiniz.

Şöyle ki:

resim açıklamasını buraya girin

Çok fazla iş gibi görünebilir, ancak telefonlar için birden fazla etkinlik kullanarak, temel Etkinlik yaşam döngüsünü ve Amaç geçişini etkinleştirirsiniz. Bu, çerçevenin tüm animasyonları ve arka yığını işlemesini sağlar.

Kodun azaltılmasına yardımcı olmak için bir BaseActivityve kullanabilirsiniz .

Kullanıcının bir tableti varsa MyMultiPaneFragActivityya da benzer bir şey kullanırsınız . Bu etkinlik, parçalardan geri aramaların yönetilmesinden ve amaçların doğru parçaya (arama amacı gibi) yönlendirilmesinden sorumludur.

Kullanıcının bir telefonu varsa, çok az kodlu normal bir Etkinlik kullanabilir ve bu telefonun genişletilmesini MyBaseSingleFragActivityveya benzer bir şey olmasını sağlayabilirsiniz . Bu faaliyetler çok basit olabilir, 5-10 satır kod (belki daha az).

Zor kısmı yönlendirme niyetleri ve ne olursa olsun. * (Düzenle: aşağıya bakın).

Bunun önerilen yol olmasının sebebi hafızayı korumak, karmaşıklığı ve eşleşmeyi azaltmak. Parçalar'ı değiştiriyorsanız FragmentManager, arka yığın için bu Parçaya bir referans tutar. Ayrıca kullanıcı için neyin çalışması gerektiğini de basitleştirir. Bu kurulum ayrıca Parçadaki görünümleri, düzeni ve mantığı Etkinlik yaşam döngüsünden ayırır. Bu şekilde bir Parça tek bir aktivitede, başka bir parçanın (iki bölmeli) yanında veya üç bölmeli bir Etkinlikte vb. Bulunabilir.

* Düzenli niyet yönlendirmesine sahip olmanın avantajlarından biri, bir etkinliği arka planda herhangi bir yerden açıkça başlatabilmenizdir. Bir örnek arama sonuçları için olabilir. (MySearchResults.class).

Daha fazlası için burada bir şeyler okuyun:

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

Biraz daha ön çalışma olabilir, çünkü her bir parça ayrı faaliyetlerde iyi çalışmalıdır, ancak genellikle işe yarar. Bu, farklı parça kombinasyonlarını tanımlayan alternatif parça dosyalarını kullanabileceğiniz, parça kodunu modüler tutabileceğiniz, eylem çubuğu yönetimini basitleştirebileceğiniz ve sistemin tüm arka yığın işlerini işlemesine izin verebileceğiniz anlamına gelir.


MySearchResults avantajı - el cihazına veya tablete bağlı olarak bu amaca farklı bir yanıt vermenizi öneririz - bu neden her iki durumda da yanıt veren tek bir etkinliğe sahip olmaktan daha iyidir? Tablette düzenli bir niyet yönlendirmesi yoktur - bu nedenle tablet için sorunu yine de çözmeniz gerekir. Neden bu çözümü ahizede de kullanmıyorsunuz?
Richard Le Mesurier

Buradaki avantaj, tablet kodunuzun birden fazla bölmeye yönlendirilmesini beklemesidir. Bazen tek bir niyette birden fazla bölmeyi değiştirmek isteyebilirsiniz. Soldaki arama sonuçları gibi sağdaki daha büyük bölmedeki ilk öğenin detials ile. Bu kod tek bir düzene taşınabilir değildir.
pjco

Çok fazla olduğunda parçaları değiştirmek neden uygun, ancak sadece 1 parça görünürse, başka bir parçaya geçmemeliyim?
Richard Le Mesurier

Ne demek istediğinizi anladığımdan emin değilim, ancak yukarıdaki yorumumu netleştirmek için: Bazen çok parçalı bir düzende aynı anda 1'den fazla parçayı değiştirmek isteyebilirsiniz. Bu, tek bir fragman düzeninde tekrar kullanamayacağınız 2 parçayı değiştirmek için kod gerektirir
pjco 12:12

Hoş geldiniz :) Lütfen cevap verin ya da yararlı olduğunu düşünüyorsanız
onaylayın

6

İşte alınan aynı ilişkin Reto Meier'in cevabı, bu video hakkındaki Udacity Android Temelleri kursu .

Uygulamanızı farklı etkinliklere ayırmaktan daha iyi olmanızın birkaç nedeni vardır.

  • Tek bir monolitik etkinliğe sahip olmak, kodunuzun karmaşıklığını artırır, bu da okumayı, test etmeyi ve bakımını zorlaştırır.
  • Amaç filtreleri oluşturmayı ve yönetmeyi çok daha zor hale getirir.
  • Bağımsız bileşenlerin sıkıca bağlanması riskini artırır.
  • Tek bir etkinlik hem hassas bilgileri hem de paylaşılması güvenli bilgileri içeriyorsa, güvenlik risklerinin ortaya çıkma olasılığını artırır.

İyi bir kural, bağlam her değiştiğinde yeni bir etkinlik oluşturmaktır. Örneğin, farklı türde bir veri görüntüleme ve görüntüleme işleminden veri girmeye geçiş sırasında.


İlginç bir şekilde videonun başlığı "Neden Sadece Parça Kullanmıyoruz"
Richard Le Mesurier

iyi bir yaklaşım, tek aktivite birden fazla parça ile tonlarca sorunla karşı karşıya ... gerçek exp muhtemelen
GvSharma

4

Bu yöntemle ilgili bir sorun, ana Tablet Etkinliğinde ve ayrı Telefon Etkinliklerinde mantığın çoğunu çoğaltmanızdır.

Master-detay örüntüsünde iki aktivite vardır. Biri daha büyük ekranlarda her iki parçayı ve daha küçük ekranlarda sadece "ana" parçayı gösterir. Diğeri daha küçük ekranlarda "detay" parçasını gösterir.

Ayrıntı mantığınız ayrıntı parçasına bağlanmalıdır. Bu nedenle, etkinlikler arasındaki ayrıntı mantığıyla ilgili kod çoğaltması yoktur - ayrıntı etkinliği yalnızca ayrıntı parçasını görüntüler, belki de Intentfazladan veri aktarır.

Ayrıca ActionBarSherlock hakkında okuduğum şey, Etkinlikler yerine Parçalarla en iyi şekilde çalıştığı görünüyor (ancak henüz onunla çalışmadım).

ActionBarSherlock'un, yerel eylem çubuğundan daha fazla parça ile ilgisi yoktur, çünkü ActionBarSherlock yalnızca yerel eylem çubuğunun bir backport'udur.


Tek bir etkinlik fikri hakkındaki düşünceleriniz nelerdir?
theblang

@mattblang: Navigasyonu doğru yaptığınız sürece bununla ilgili bir sorun yok.
CommonsWare

1
Tek bir etkinlik mimarisine yeniden bakmayı denedim çünkü bir parçayı değiştirmek, içindeki aynı parçayla yeni bir etkinlik başlatmaktan çok daha hızlı. Ben gibi olsa çok fazla kırılmaların içine çalıştırıyorum gibi hissediyorum bu . Çevrimiçi bulduğum çoğu örnek, özellikle ana ayrıntı gibi çok parçalı yapılandırmalar için tek bir etkinlik kullanmayın. Bu yüzden biraz ikilem içindeyim.
theblang

0

"Telefon uygulamasını birçok Etkinliğe ayırmak için bir neden var mı?" - Evet. sadece kullanılabilir alana gelir, bir tablet geliştiricilere daha fazla yer verir, böylece geliştiricilerin tek bir ekrana daha fazla koymasına izin verir. Android, Etkinlikler'in bir ekran sağlayabileceğini söylüyor . Bir tablette 1 büyük ekranla yapabileceğiniz şey, bir telefonda birden fazla ekrana yayılması gerekebilecek bir şeydir, çünkü tüm fragmanlar için yeterli alan yoktur.


1. cümle - "Etkinlik, kullanıcıların bir şeyler yapmak için etkileşime girebileceği bir ekran sağlayan bir uygulama bileşenidir ". Orijinal açıklamamda bir hata görüyorum, "başka bir ekran var" demek istemedim
EFlisio
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.