2009-07-21 3 views
20

Accordion-style widget such as on this page을 만드는 가장 좋은 방법을 찾고 있습니다. 표준 Android 툴킷을 사용하여 동일한 효과를 얻는 방법이 있습니까? 아니면 맞춤 위젯을 만들어야합니까? 그렇다면 어느 것이 좋습니다?안드로이드 - 아코디언 위젯

+1

보기 유형을 숨김으로 설정하고 표시를 사용하면 좋은 해결책이 있습니다. 여기 있습니다 .. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit

+0

왜 이것이 기본 도구가 아닌가요? – mitsest

답변

21

위에 ExpandableListView-들, 쌓이는 시도하는 또 다른 것은 다음과 같습니다. 우리는 2.2, 2.3.x, 3.2 및 4.0.3에서 테스트 한 고객 용으로 사용합니다. 우리에게 꽤 효과적입니다.

다음 단계에서 접기/펼치기에 애니메이션을 추가하려고합니다. 나 자신을 위험을 감수해야하고 @Bostone 응답이 가장 적절하다고 말할

enter image description here

+0

안녕 Maciej, 아코디언을 성공적으로 실행합니다. 응용 프로그램 및 아주 좋아 보인다. 내 응용 프로그램에 포팅하고 싶었지만 어떻게해야합니까? 파일 복사를 시도했지만 ic_resource에 문제가 있습니다. 나는 그것을 올바르게하고 있는가? 하나는 모든 파일을 복사해야합니까? –

+1

@NicholasTJ 당신이 github에 관해서 물어 봐야한다고 생각합니다 ...하지만 여기에서 물어 봤기 때문에 : 프로젝트는 android library project입니다. http://developer.android.com/tools/projects/index.html# 도서관 프로젝트. maven으로 빌드하고 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> 

아마도 내가 GitHub의에서 android accordion view 프로젝트를 추진해 왔습니다 서로

+15

안녕하세요, 그 코드는 익숙한 모양입니다. ;-) – CommonsWare

+4

나는 이것을 세계와 공유해야만했습니다 : 기록을 위해 - 이것은 maillist (android.developers)의 @commonsguy가 내놓은 스 니펫 – Bostone

+0

안녕하세요 다이나믹하게 아코디언을위한 버튼을 만드는 것은 목록에있는 버튼의 수가 확실하지 않기 때문입니다. 모든 버튼에 대해 LinearLayout이 있으며 내부에 일부 뷰가 있습니다. 아무도 나에게 각각의 아코디언 버튼의 onclicklistner를 얻는 방법을 알려줄 수있어서, 각각의 LinearLayouts에 대해 visiblity와 Gone 사이를 토글 할 수 있습니다. –

3

:

여기에 작은 스크린 샷입니다. 내가 볼 수 있도록 아래에 코드를 제공 할 것입니다. GitHub Maciej Ł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에 본사를 둔 내 솔루션입니다 해당 자바, 버튼을 찾아 onClickListener를 설정하면 onClickListener 안에 레이아웃을 찾을 수 있습니다.

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

이 원하는 서로 여러 번에 걸쳐 넣어 수 있습니다.

이제 아코디언처럼 보이게 만들려면 버튼을 포주 수 있습니다. 당신은 모범을 사용하여, 그것의 오른쪽에있는 화살표를 넣어 수 : 사라 졌는지 (드로어 블을 변경하여 OnClickListener를 내부에 화살표의 방향을 변경하기 위해 조건을 사용하는 것이

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

당신은 무엇을해야하고 아래쪽 화살표 및 위쪽 화살표가 보이는 경우).

또한, 당신은 다음과 같이 애니메이션을 추가하여 더 자연스럽게 만들 수 있습니다

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

아코디언을 시뮬레이트하기 위해 자신의 방법을 사용했지만, 내부 LinearLayout은 자식 컨트롤에 따라 확장되지 않습니다. 레이아웃의 내부에서 ListView를 몇 가지 요소와 함께 배치합니다. 실행했을 때의 효과는 첫 번째 요소 만 표시되었지만 목록보기를 스크롤하여 한 번에 하나씩 다른 항목을 볼 수 있습니다. 모든 아코디언은 프로그래밍 방식으로 만들어지고 있습니다. 이 문제를 해결하고 스크롤없이 전체 목록보기를 표시하는 방법에 대한 힌트를 줄 수 있습니까? – jstuardo

+0

@jstuardo 임 죄송하지만 귀하의 문제는 listviews와 관련이 있다고 생각합니다. listviews는 항상 화면에 사용 가능한 크기에 맞게 요소를로드합니다. 그래서, 사용할 수있는 크기가 없다면 ... viewviews에서 볼 수있는 바깥 쪽의 다음 요소는 사용자가 볼 필요가있을 때만 생성됩니다. 이것은 메모리를 절약하게 만듭니다. 제 수정본에 문제가있는 경우 슬플 겁니다.하지만 linearlayout heigh properties를 수정하면 고칠 수 있다고 생각합니다. match parent를 시도하십시오. 또한 기본적으로 표시 여부를 사용하지 않고 어떤 일이 발생하는지 확인하십시오. ... 목록보기 동작을 무시할 수 있습니다. 알려줘. – cutiko

+0

@jstuardo 비슷한 문제가 있었으면 다음을 읽어보세요. http://stackoverflow.com/questions/18411494/android-listview-show-only-one-item http://stackoverflow.com/a/ 32881309/4017501 http://stackoverflow.com/a/31818632/4017501 – cutiko