2009-07-21 26 views
20

Tôi đang tìm cách tốt nhất để tạo một Accordion-style widget such as on this page. Có cách nào để đạt được hiệu quả tương tự bằng cách sử dụng bộ công cụ Android tiêu chuẩn hay tôi cần xây dựng tiện ích tùy chỉnh? Nếu vậy - bạn muốn giới thiệu cái nào nếu có?Android - accordion widget

+1

Tôi có giải pháp tốt bằng cách sử dụng loại chế độ xem bị ẩn và Hiển thị. Đây là nó .. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit

+0

Tại sao đây không phải là một tiện ích gốc? – mitsest

Trả lời

21

tôi đã đẩy android accordion view dự án tại github. Chúng tôi sử dụng nó cho khách hàng của chúng tôi, thử nghiệm trên 2.2, 2.3.x, 3.2 và 4.0.3. Hoạt động khá tốt cho chúng tôi.

Sẽ thêm hoạt ảnh khi gấp/mở trong bước tiếp theo.

Dưới đây là ảnh chụp màn hình nhỏ:

enter image description here

+0

Xin chào Maciej, tôi đã chạy thành công accordion của bạn ứng dụng và có vẻ rất tốt. Tôi muốn chuyển sang ứng dụng của mình, làm thế nào tôi có thể làm điều đó? Tôi đã thử sao chép các tập tin, nhưng tôi đang gặp vấn đề với ic_resource không tìm thấy. Tôi có làm đúng cách không? nên sao chép tất cả các tệp ra? –

+1

@NicholasTJ Tôi nghĩ bạn nên hỏi về nó trên github ... nhưng kể từ khi bạn hỏi ở đây: dự án là dự án thư viện android, đọc thêm về nó ở đây http://developer.android.com/tools/projects/index.html# LibraryProjects. Bạn có thể xây dựng với maven và nhận được apklib - xem tại đây https://code.google.com/p/maven-android-plugin/wiki/ApkLib –

+0

Cảm ơn bạn đã tip, tôi đánh giá cao nó, tôi sẽ đọc trên các liên kết bạn được cung cấp. –

27

Và trong trường hợp bạn vẫn tự hỏi - điều này có thể được thực hiện khá nhiều với cặp nút/bố cục được xếp chồng lên nhau bên trong bố cục tuyến tính. Pseudo code sau

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

Một điều để có thể thử được xếp chồng ExpandableListView-s trên đầu trang của mỗi khác

+15

Hey, mã đó trông quen thuộc ... ;-) – CommonsWare

+4

Tôi đã phải chia sẻ nó với thế giới :) Đối với hồ sơ - đây là một đoạn cho tôi bởi @commonsguy trên maillist (android.developers) – Bostone

+0

Hellow I am dynamiaclly tạo các nút cho accordion vì nó không chắc chắn về số lượng nút trong danh sách. cho mỗi nút tôi có LinearLayout với một số khung nhìn bên trong nó. Ai có thể cho tôi biết làm thế nào để có được onclicklistner của nút accordion tương ứng, để tôi có thể chuyển đổi giữa visiblity và Gone cho LinearLayouts tương ứng. –

3

tôi phải mạo hiểm bản thân mình và nói rằng câu trả lời @Bostone là thích hợp nhất. Tôi sẽ cung cấp cho bạn mã của tôi dưới đây để bạn có thể nhìn thấy. Cảm ơn GitHub Maciej Łopaciński, nhưng như @SudoPlz đã nói trong phần bình luận, không có tài liệu nào cả. Tôi không biết bắt đầu từ đâu. Tôi cố gắng làm điều đó với Eclipse và Android Studio và trong cả hai tôi không thể chạy dự án để bắt đầu tìm ra cách hoạt động của nó. Bên cạnh đó, cam kết cuối cùng trong dự án đó là khoảng 1 năm trước, điều đó khiến tôi lo sợ rằng nếu có điều gì đó không ổn, tôi sẽ bị kẹt ở một ngõ cụt. Vì vậy, không chậm trễ hơn nữa, đây là giải pháp của tôi có trụ sở tại @Bostone:

1. Trước tiên, bạn phải tạo một Button và một Layout lồng trong một scrollview:

<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.- Sau đó đi đến JAVA tương ứng của bạn, có nút tìm và đặt onClickListener, bên trong onClickListener bạn sẽ tìm thấy bố cục.

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

      } 
     }); 

3.- Vì vậy, bây giờ bên trong onClickListener, chúng tôi sẽ tìm bố cục. Như bạn có thể thấy trong bước đầu tiên, bố cục được đặt theo mặc định là GONE, nhưng bây giờ chúng tôi phải đặt bố cục đó thành hiển thị. Vấn đề là, làm thế nào tôi có thể làm cho nó biến mất một lần nữa và ngược lại? Vì vậy, chúng tôi sẽ thêm một điều kiện để có được khả năng hiển thị của bố cục và dựa trên đó sẽ được ẩn hoặc hiển thị:

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

Có thể đặt lại nhiều lần bạn muốn.

Vì vậy, bây giờ nếu bạn thực sự muốn làm cho nó trông giống như một accordion bạn có thể pimp nút. Bạn có thể đặt một mũi tên bên phải của nó, sử dụng bằng ví dụ:

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

Bạn nên làm điều đó bên trong OnClickListener và sử dụng tình trạng này để thay đổi hướng của mũi tên, bằng cách thay đổi drawable (nếu đã biến mất và mũi tên xuống và nếu có thể nhìn thấy mũi tên lên).

Ngoài ra, bạn có thể làm cho nó trông tự nhiên hơn bằng cách thêm một hình ảnh động, như thế này:

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

Bạn sẽ phải cân nhắc rằng hình ảnh động trên phải được thực hiện trong khi quan điểm là nhìn thấy được. Xin lưu ý rằng setFillAfter(true), sẽ thay đổi kích thước của vùng chứa vĩnh viễn vì vậy nếu bạn làm như vậy, có thể bạn không muốn sử dụng VIEW.GONE nữa. Câu hỏi này có một lời giải thích tuyệt vời về Scale Animation

+0

Tôi đã sử dụng cách để mô phỏng một accordion, tuy nhiên, LinearLayout bên trong không mở rộng theo điều khiển con của nó. Bên trong bố cục đó, tôi đang đặt một ListView với một số yếu tố. Hiệu ứng khi tôi chạy nó chỉ là phần tử đầu tiên được hiển thị, nhưng tôi có thể cuộn chế độ xem danh sách để xem các mục khác cùng một lúc. Tất cả các accordion đang được tạo lập trình. Bạn có thể cho tôi một gợi ý về cách giải quyết điều này và để hiển thị toàn bộ danh sách mà không cần cuộn? – jstuardo

+0

@jstuardo Im xin lỗi nhưng tôi nghĩ rằng vấn đề của bạn phải làm với các listviews, listviews luôn tải đủ các yếu tố để phù hợp với kích thước có sẵn trong màn hình. Vì vậy, những gì, nếu không có kích thước có sẵn ... trong listviews yếu tố tiếp theo bên ngoài của có thể xem được tạo ra chỉ khi người dùng cần phải nhìn thấy nó, điều này là nguyên nhân nó tiết kiệm bộ nhớ. Tôi sẽ buồn nếu sửa chữa của tôi có vấn đề đó, nhưng tôi nghĩ rằng bạn có thể sửa chữa nó thay đổi các thuộc tính chiều cao linearlayout. Thử so khớp với cha mẹ. Ngoài ra, hãy xem điều gì xảy ra mà không sử dụng khả năng hiển thị đã biến mất theo mặc định. ... có thể bạn có thể ghi đè hành vi của chế độ xem danh sách. Cho tôi biết. – cutiko

+0

@jstuardo Đã xảy ra sự cố tương tự, bạn có thể muốn đọc nội dung này: http://stackoverflow.com/questions/18411494/android-listview-show-only-one-item http://stackoverflow.com/a/ 32881309/4017501 http://stackoverflow.com/a/31818632/4017501 – cutiko

Các vấn đề liên quan