2009-07-21 27 views
20

मैं Accordion-style widget such as on this page बनाने का सबसे अच्छा तरीका देख रहा हूं। क्या मानक एंड्रॉइड टूलकिट का उपयोग करके एक ही प्रभाव प्राप्त करने का कोई तरीका है या क्या मुझे कस्टम विजेट बनाने की आवश्यकता है? यदि ऐसा है - तो आप किसी को विस्तारित करने की सिफारिश करेंगे?एंड्रॉइड - accordion विजेट

+1

के बारे में एक अद्भुत स्पष्टीकरण है मेरे पास दृश्य प्रकार छुपा और दृश्यमान उपयोग करके एक अच्छा समाधान है। यह है .. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit

+0

यह मूल विजेट क्यों नहीं है? – mitsest

उत्तर

21

मैं GitHub पर android accordion view परियोजना धकेल दिया के शीर्ष पर stacking है ExpandableListView-s इस प्रकार है। हम इसे अपने ग्राहकों के लिए 2.2, 2.3.x, 3.2 और 4.0.3 पर परीक्षण करते हैं। हमारे लिए बहुत अच्छा काम करता है।

अगले चरण में गुना/प्रकट होने पर एनीमेशन जोड़ने के लिए जा रहा है।

enter image description here

+0

हाय मैसीज के साथ केवल एक सूची दृश्य होना चाहिए, मैंने सफलतापूर्वक अपना एग्रीजन चलाया आवेदन और यह बहुत अच्छा लग रहा है। मैं अपने आवेदन में बंदरगाह करना चाहता था, मैं यह कैसे कर सकता हूं? मैंने फ़ाइलों की प्रतिलिपि बनाने की कोशिश की, लेकिन मुझे आईसी_सोर्स के साथ समस्याएं नहीं मिलीं। क्या मैं इसे सही तरीके से कर रहा हूं? क्या किसी को सभी फाइलों की प्रतिलिपि बनाना चाहिए? –

+1

@ निकोलस टीजे मुझे लगता है कि आपको इसके बारे में जिथब पर पूछना चाहिए ... लेकिन चूंकि आपने यहां पूछा था: प्रोजेक्ट एंड्रॉइड लाइब्रेरी प्रोजेक्ट है, इसके बारे में यहां और पढ़ें http://developer.android.com/tools/projects/index.html# LibraryProjects। आप मेवेन के साथ निर्माण कर सकते हैं और apklib प्राप्त कर सकते हैं - यहां देखें https://code.google.com/p/maven-android-plugin/wiki/ApkLib –

+0

टिप के लिए धन्यवाद, मैं इसकी सराहना करता हूं, मैं आपको लिंक पर पढ़ूंगा प्रदान की है। –

27

और यदि आप अभी भी आश्चर्यचकित हैं - यह रैखिक लेआउट के अंदर रखे बटन/लेआउट की जोड़ी के साथ काफी कुछ किया जा सकता है। छद्म कोड

<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> 

एक और बात संभवतः कोशिश करने के लिए एक दूसरे को

+15

अरे, वह कोड परिचित दिखता है ... ;-) – CommonsWare

+4

मुझे इसे दुनिया के साथ साझा करना था :) रिकॉर्ड के लिए - यह मुझे एक कॉपिपेट है जिसे माइलिस्ट (एंड्रॉइड.डेवाल्डर) पर @commonsguy द्वारा दिया गया है – Bostone

+0

हैलो मैं हूँ डायनेमिकली को accordion के लिए बटन बनाना क्योंकि यह सूची में बटन की संख्या के बारे में निश्चित नहीं है। प्रत्येक बटन के लिए मेरे अंदर कुछ विचारों के साथ LinearLayout है। क्या कोई मुझे बता सकता है कि संबंधित accordion बटन के ऑनक्लिकलिस्टर को कैसे प्राप्त किया जाए, ताकि मैं संबंधित लिनियरलाउट्स के लिए दृश्यता और गोन के बीच टॉगल कर सकूं। –

3

मैं अपने आप को जोखिम के लिए है और कहते हैं कि @Bostone जवाब सबसे उपयुक्त है:

यहाँ छोटे स्क्रीनशॉट है। मैं आपको नीचे अपना कोड दूंगा ताकि आप देख सकें। गिटहब मासीज Łopaciński के लिए धन्यवाद, लेकिन @SudoPlz टिप्पणी में कहा, बिल्कुल कोई दस्तावेज नहीं है। मुझे नहीं पता था कि कहां से शुरू करना है। मैं ग्रहण और एंड्रॉइड स्टूडियो के साथ ऐसा करने की कोशिश करता हूं और न ही मैं इस परियोजना को चलाने के लिए प्रोजेक्ट चला सकता हूं कि यह कैसे काम करता है। इसके अलावा, उस परियोजना में आखिरी प्रतिबद्धता लगभग 1 साल पहले थी, जिससे मुझे बहुत डर लगता है कि अगर कुछ गलत हो जाता है तो मैं एक मृत अंत में फंस जाऊंगा।

<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.- सबसे पहले आप एक बटन और एक लेआउट एक scrollview में नेस्ट बनाने के लिए: तो आगे देरी के बिना, यहाँ मेरी समाधान @Bostone में आधारित है आपके संबंधित जावा, बटन पर क्लिक करें और ऑनक्लिक लिस्टनर सेट करें, ऑनक्लिक लिस्टनर के अंदर आपको लेआउट मिलेगा।

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

      } 
     }); 

3.- तो अब onClickListener अंदर हम लेआउट मिल जाएगा। जैसा कि आप पहले चरण में देख सकते हैं लेआउट डिफ़ॉल्ट रूप से GONE पर सेट किया गया है, लेकिन अब हमें इसे दृश्यमान रूप से सेट करना होगा। समस्या यह है कि, मैं इसे फिर से कैसे बना सकता हूं और इसके विपरीत? इसलिए हम लेआउट की दृश्यता प्राप्त करने के लिए एक शर्त जोड़ देगा और के आधार पर है कि यह छुपा दिया जाएगा या दिखाई देते हैं:

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); 
       } 
      } 
     }); 

यह एक दूसरे के रूप में कई बार आप चाहते हैं उस पर रखा जा सकता है।

तो अब यदि आप वास्तव में इसे एक accordion की तरह दिखाना चाहते हैं तो आप बटन को पिंप कर सकते हैं। आप एक तीर इसके बारे में सही पर, उदाहरण के द्वारा का उपयोग कर डाल सकता है:

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

आप क्या करना चाहिए कि onClickListener अंदर और शर्त का उपयोग तीर की दिशा बदलने के लिए, drawable बदलकर (यदि चला गया है और नीचे तीर, और यदि ऊपर तीर दिखाई देता है)।

इसके अलावा, आप इसे इस तरह एक एनीमेशन जोड़ने, द्वारा और अधिक प्राकृतिक देख सकते हैं:

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); 

आप पर विचार करना है कि ऊपर एनीमेशन से किया जाना चाहिए, जबकि दृश्य दिखाई दे रहा है होगा। कृपया ध्यान रखें कि setFillAfter(true), कंटेनर के आकार को स्थायी रूप से बदल देगा ताकि यदि आप ऐसा करते हैं, तो शायद आप VIEW.GONE का उपयोग नहीं करना चाहते हैं। इस प्रश्न में Scale Animation

+0

मैंने एक accordion अनुकरण करने के लिए अपना रास्ता इस्तेमाल किया, हालांकि, आंतरिक LinearLayout अपने बच्चे के नियंत्रण के अनुसार विस्तार नहीं करता है। उस लेआउट के अंदर, मैं कुछ तत्वों के साथ एक सूची दृश्य रख रहा हूं। जब मैं इसे चलाता हूं तो प्रभाव केवल पहला तत्व दिखाया जाता है, लेकिन मैं एक समय में अन्य वस्तुओं को देखने के लिए सूचीदृश्य को स्क्रॉल कर सकता हूं। सभी accordion प्रोग्रामेटिक रूप से बनाया जा रहा है। क्या आप मुझे हल करने के लिए संकेत दे सकते हैं और स्क्रॉल के बिना पूरी सूची दृश्य दिखाने के लिए? – jstuardo

+0

@jstuardo मुझे खेद है, लेकिन मुझे लगता है कि आपकी समस्या सूचीदृश्यों के साथ करना है, सूचीदृश्य हमेशा स्क्रीन में उपलब्ध आकार को फिट करने के लिए पर्याप्त तत्व लोड करते हैं। तो क्या, यदि कोई आकार उपलब्ध नहीं है ... सूचीदृश्य में दृश्य तत्व के बाहर अगला तत्व केवल तभी बनाया जाता है जब उपयोगकर्ता इसे देखने की आवश्यकता हो, तो यह स्मृति को सहेजने का कारण बनता है। अगर मेरे फिक्स में समस्या है तो मुझे दुःख होगा, लेकिन मुझे लगता है कि आप लाइनरलेआउट को उच्च गुणों को बदलने में इसे ठीक कर सकते हैं। मैच अभिभावक का प्रयास करें। यह भी देखें कि डिफ़ॉल्ट रूप से दृश्यता का उपयोग किए बिना क्या होता है। ... शायद आप सूचीदृश्य व्यवहार को ओवरराइड कर सकते हैं। मुझे बताएं। – cutiko

+0

@jstuardo एक समान समस्या थी, तो आप इसे पढ़ना चाहेंगे: http://stackoverflow.com/questions/18411494/android-listview-show-only-one-item http://stackoverflow.com/a/ 3288130 9/4017501 लाइब्रेरी के साथ जाने के बजाय http://stackoverflow.com/a/31818632/4017501 – cutiko

संबंधित मुद्दे