2009-07-21 15 views
20

私はAccordion-style widget such as on this pageを作成する最良の方法を考えています。 標準のAndroidツールキットを使用して同じ効果を達成する方法はありますか、カスタムウィジェットを作成する必要はありますか?もしそうなら、もしあれば、どれを延長することをお勧めしますか?Android - accordionウィジェット

+1

私はビューの種類を隠して表示することで良い解決策を得ています。これは.. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit

+0

これはネイティブウィジェットではないのはなぜですか? – mitsest

答えて

21

の上にExpandableListView-Sを積み重ねています。 2.2、2.3.x、3.2、および4.0.3でテストされた、お客様のために使用します。私たちのためにかなり良い作品。

次のステップで折りたたんだ/展開したアニメーションを追加しようとしています。ここで

は小さなスクリーンショットです:

enter image description here

+0

で1つだけにしてください。Maciej、アプリケーションとそれは非常によく見えます。アプリケーションに移植したかったのですが、どうすればいいのですか?ファイルをコピーしようとしましたが、ic_resourceに問題があります。私はそれを正しい方法でやっていますか? 1つはすべてのファイルをコピーする必要がありますか? –

+1

@NicholasTJあなたはgithubでそれについて尋ねるべきだと思います...しかし、あなたがここで尋ねてきたので、プロジェクトはアンドロイドライブラリプロジェクトです、それについてはこちらhttp://developer.android.com/tools/projects/index.html# LibraryProjects。あなたは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

私はそれを世界と共有しなければなりませんでした:)記録のために - これはメイリスト(アンドロイドデベロッパー)の@commonsguyによって与えられたスニペットです – Bostone

+0

私は午前ダイナミックに、アコーディオン用のボタンを作成します。リスト内のボタンの数がわからないからです。私はLinearLayoutを内部にいくつかのビューを持つすべてのボタンのために。誰も私にそれぞれのアコーディオンボタンのonclicklistnerを取得する方法を教えてもらうことができますので、それぞれのLinearLayoutsのvisiblityとGoneを切り替えることができます。 –

3

私は自分自身を危険にさらすと@Bostoneの答えが最も適切であると言わざるを得ない。あなたが見ることができるように私はあなたに私のコードを与えます。 GitHub MaciejŁopacińskiに感謝します。@SudoPlzはコメントの中で、ドキュメントはまったくありません。私はどこから始めるべきか分からなかった。私はEclipseとAndroid Studioでそれをやろうとしていますが、どちらのプロジェクトでも、その作業の仕組みを理解し始めることはできませんでした。さらに、そのプロジェクトの最後のコミットは約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に基づいて、私の解決策がありますあなたの対応するJava、ボタンを見つけ、onClickListenerを設定すると、レイアウトを見つけることができます。

3-だから今onClickListenerの内部にレイアウトがあります。最初のステップで見られるように、レイアウトはデフォルトでGONEに設定されていますが、今度はそれをvisibleに設定する必要があります。問題は、どうすればそれをもう一度やり直すことができますか?

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

これは、あなたが望む何回も互いの上に置くことができます。だから我々は、レイアウトの可視性を取得し、それが非表示または表示されることに基づいて条件を追加します。

あなたが本当にアコーディオンのように見せたい場合は、ボタンを押すことができます。あなたが例で使用して、それの右側にある矢印を置くことができます:

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

をあなたはなくなっている場合onClickListener内および(描画可能に変更することで、矢印の方向を変更するための条件を使用することを行う必要がありますし、下矢印、および上矢印が表示されている場合)。

また、あなたはそれがこのように、アニメーションを追加することによって、より自然に見えるようにすることができます

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を配置しています。私が実行すると、最初の要素だけが表示されますが、リストビューをスクロールして他の項目を1つずつ表示することができます。すべてのアコーディオンはプログラムによって作成されています。この問題を解決する方法とスクロールなしでリストビュー全体を表示する方法のヒントを教えてください。 – jstuardo

+0

@jstuardo申し訳ありませんが、あなたの問題はlistviewsと関係があり、listviewsは常に画面に利用可能なサイズに合わせて十分な要素を読み込んでいると思います。したがって、利用可能なサイズがない場合、リストビューでは、ユーザーが表示する必要がある場合にのみ、ビュー可能領域外の次の要素が作成されます。これはメモリを節約するためです。 私の修正にこの問題がある場合は悲しくなりますが、linearlayoutの高さのプロパティを変更すると修正できると思います。マッチする親を試してください。デフォルトで表示される可視性を使わずに何が起こるかも見てください。 ...リストビューの動作をオーバーライドすることができます。お知らせ下さい。 – 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