2009-07-21 17 views
20

Bir Accordion-style widget such as on this page yaratmanın en iyi yolu bakıyorum. Standart Android araç setini kullanarak aynı efekti elde etmenin bir yolu var mı yoksa özel widget'ı mı oluşturmam gerekiyor? Eğer öyleyse - hangisini uzatmayı önerirsiniz?Android - akordeon Widget

+1

hakkında harika bir açıklaması var. Görüntüleme türü gizli ve Görünür'ü kullanarak iyi bir çözüme sahibim. İşte bu .. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit

+0

Neden bu yerel bir widget değil mi? – mitsest

cevap

21

üstünde ExpandableListView-s yığılmadır denemek için başka bir şey izler. Müşterilerimiz için kullanıyoruz, 2.2, 2.3.x, 3.2 ve 4.0.3 üzerinde test ettik. Bizim için oldukça iyi çalışıyor.

sonraki aşamada açılmak/kat üzerinde animasyon eklemek gidiş. Kendimi riske atmak zorunda ve @Bostone cevap en uygun olduğunu söylemek

enter image description here

+0

Merhaba Maciej, başarıyla akordeon çalıştırın uygulama ve çok iyi görünüyor. Başvuruma giriş yapmak istedim, bunu nasıl yapabilirim? Dosyaları kopyalamayı denedim, ancak ic_resource ile ilgili sorun yaşıyorum. Bunu doğru şekilde yapıyorum? Biri tüm dosyaları kopyalamalı mı? –

+1

@NicholasTJ Bence bunu github'da sormalısın ... ama burada sorduğun için: proje android kütüphane projesi, http://developer.android.com/tools/projects/index.html# LibraryProjects. Maven ile inşa edebilir ve apklib alabilirsiniz - https://code.google.com/p/maven-android-plugin/wiki/ApkLib –

+0

adresine bakın. İpucu için teşekkürler, linkleri okuyacağım sağlanan. –

27

Ve durumda hala merak - bu hemen hemen doğrusal düzen içinde yığılmış düğmesi/düzeni çifti ile yapılabilir. Sözde kod

<LinearLayout android:orientation="vertical"> 
    <Button android:text="Panel 1"/> 
    <SomeKindOfLayout android:id="@+id/panel1"> 
      <!-- widgets in first panel go here --> 
    </SomeKindOfLayout> 
    <Button android:text="Panel 2"/> 
    <SomeKindOfLayout android:id="@+id/panel2" android:visibility="gone"> 
      <!-- widgets in second panel go here --> 
    </SomeKindOfLayout> 
    <Button android:text="Panel 3"/> 
    <SomeKindOfLayout android:id="@+id/panel3" android:visibility="gone"> 
      <!-- widgets in third panel go here --> 
    </SomeKindOfLayout> 
    <Button android:text="Panel 4"/> 
    <SomeKindOfLayout android:id="@+id/panel4" android:visibility="gone"> 
      <!-- widgets in fourth panel go here --> 
    </SomeKindOfLayout></LinearLayout> 

muhtemelen github de android accordion view projeyi itmiş birbirlerine

+15

Hey, bu kod tanıdık geliyor ... ;-) – CommonsWare

+4

Dünyayla paylaşmak zorundaydım :) Kayıt için - bu mailistte @commonsguy tarafından verilen bir snippet (android.developers) – Bostone

+0

Hellow Ben Dynamiacally, akordiyon butonlarını yaratarak listedeki buton sayısı konusunda emin değil. Her düğme için, içinde bazı görünümler bulunan LinearLayout var. İlgili akordeon düğmesinin onclicklistini nasıl elde edeceğimi bilen herhangi biri olabilir, böylece ilgili LinearLayouts için Visiblity ve Gone arasında geçiş yapabilirim. –

3

:

İşte küçük bir ekran görüntüsü. Görebildiğim için sana kodumu aşağıda vereceğim. GitHub Maciej Łopaciński için teşekkürler, ama yorumlarda @SudoPlz'ın söylediği gibi, hiç bir dokümantasyon yok. Nereden başlayacağımı bilmiyordum. Eclipse ve Android Studio ile yapmaya çalışıyorum ve ne işe yaradığını anlamaya başlamak için projeyi çalıştıramazdım. Ayrıca, bu projedeki son taahhüt yaklaşık 1 yıl önceydi, bir şeylerin yanlış gitmesi durumunda bir çıkmazda sıkışacağımdan korkuyorum. Buna gittikten sonra

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".TasksListActivity"> 


      <Button 
       android:id="@+id/magic_btn" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Magic Btn"/> 
      <LinearLayout 
       android:id="@+id/magic_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:visibility="gone"> 

     </LinearLayout> 
</ScrollView> 

2.-:

1.- Önce bir scrollview iç içe bir adet buton ve Düzen oluşturmak zorunda: Yani daha fazla gecikmeden, burada @Bostone merkezli benim çözümdür ilgili JAVA'nız var, düğmeyi bulup onClickListener ayarladıktan sonra, düzeni bulacağınız onClickListener'ın içinde.

Button findMagicBtn = (Button) findViewById(R.id.magic_btn); 
     findMagicBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 

3.- Artık onClickListener'ın içinde düzeni bulacağız. İlk adımda görebileceğiniz gibi, düzen varsayılan olarak GONE olarak ayarlanmıştır, ancak şimdi onu görünür olarak ayarlamanız gerekir. Sorun şu ki, tekrar nasıl gidebilirim ve tersi olur mu? Bu yüzden düzeni görünürlüğünü almak için bir koşul ekleyin ve gizli olacağını dayanan veya görünecektir:

Button findMagicBtn = (Button) findViewById(R.id.magic_btn); 
     findMagicBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       LinearLayout findMagicLl = (LinearLayout) findViewById(R.id.magic_layout); 
       if (findMagicLl.getVisibility() == View.VISIBLE) { 
        findMagicLl.setVisibility(View.GONE); 
       } else { 
        findMagicLl.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 

İstediğin birbirini olarak defalarca üzerinde konabilir.

Yani şimdi gerçekten düğmeye pezevenk olabilir bir akordeon gibi görünmesi istiyorum. Onlara örnek kullanarak, bunun sağında bir ok bırakabilir: gone ise (çekilebilir değiştirerek OnClickListener içinde ve okun yönünü değiştirmek için koşul kullanmanızı

findMagicBtn.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.right_arrow, 0); 

Sen yapmalıyım ve aşağı ok ve görünür bir yukarı ok).

Ayrıca, böyle bir animasyon ekleyerek daha doğal görünmesini sağlayabilirsiniz:

ScaleAnimation animation = new ScaleAnimation(1f, 1f, 1f, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f); 
animation.setDuration(180); 
animation.setFillAfter(true); 
findMagicLl.startAnimation(animation); 

Sen görünümü görünür iken yukarıdaki animasyon yapılması gerektiğini dikkate almak gerekir. Lütfen setFillAfter(true)'un konteynerin boyutunu kalıcı olarak değiştireceğine dikkat edin, eğer böyle yaparsanız, belki de VIEW.GONE'u kullanmak istemezsiniz. Bu sorunun Scale Animation

+0

Bir akordeon simülasyonu için yolunuzu kullandım, ancak iç LinearLayout çocuk kontrolüne göre genişlemiyor. Bu düzenin içinde, bazı öğelerle bir ListView yerleştiriyorum. Çalıştırdığım zamanki etki sadece ilk öğenin gösterilmesidir, ancak diğer öğeleri bir kerede görmek için liste görünümünü kaydırırım. Tüm akordeon programlı olarak oluşturuluyor. Bunu nasıl çözeceğimi ve tüm liste görünümünü kaydırmadan nasıl göstereceğimi anlatan bir ipucu verebilir misiniz? – jstuardo

+0

@jstuardo Üzgünüz ama bence sorunun listeyle ilgisi var, liste görünümleri her zaman ekranda mevcut boyuta uyacak kadar öğe yüklüyor. Öyleyse, eğer mevcut bir boyut yoksa ... liste içinde bir sonraki öğeyi görüntülenebilir olanın dışında görmek yalnızca kullanıcının onu görmesi gerekiyorsa, bu hafızaya neden olur. Benim düzeltmemde bu sorun varsa üzgün olacağım, ama lineerbackighighighighigh özelliklerini değiştirerek bunu düzeltmek düşünüyorum. Ebeveyn eşleştirmeyi deneyin. Ayrıca varsayılan olarak kullanılmayan görünürlük kullanılmadan ne olduğuna bakın. ... belki de liste görüntüleme davranışını geçersiz kılabilirsiniz. Bilmeme izin ver. – cutiko

+0

@jstuardo Benzer bir sorunla karşılaşmış olabilirsiniz: http://stackoverflow.com/questions/18411494/android-listview-show-only-one-item http://stackoverflow.com/a/ 32881309/4017501 http://stackoverflow.com/a/31818632/4017501 – cutiko