3

オプション/詳細情報を含むビューをユーザーが展開/折りたたみ (表示/非表示) できるようにする UI 要素が必要です。

これは、テキスト ラベル (「高度なオプション」、「多い/少ない」など) と、開く/閉じるを切り替えるアイコンとして想定しています。目的に役立つアイコンがいくつかあり、要素の機能は ToggleButton の機能とほぼ一致するため、スタイルを設定した ToggleButton を使用してこの問題を解決しようとしました。

このソリューションは非常に醜いことが判明しました (メンテナンスの観点から)。以下に回答として追加します。

誰かがより良い解決策を提案したり、私の解決策を単純化する方法を指摘したりできることを願っています。

ところで、ビューの展開/折りたたみのアニメーション化は、この SO Q/Aで適切に対処されています。

4

4 に答える 4

5

ありがたいことに、もっと簡単な方法を見つけました。

ToggleButton (スタイル設定に 11 個のリソース ファイルが必要) を使用する代わりに、TextView と CompoundDrawable を使用して、状態を自分で管理しています。

この方法ではコードが少し増えますが、大量のリソース ファイルを節約できます。また、複数のテーマを簡単に処理できるようにもなります。たとえば、ここでは、テーマに応じて必要なアイコンのリソース ID を設定しています。

final MainActivity ma = (MainActivity) getActivity();
if  (ma.isDarkTheme()) {
    icon_expand = getResources().getIdentifier( "ic_action_expand","drawable", ma.getPackageName() );       
    icon_collapse = getResources().getIdentifier( "ic_action_collapse","drawable", ma.getPackageName() );       
} else {
    icon_expand = getResources().getIdentifier( "ic_action_expand_light","drawable", ma.getPackageName() );     
    icon_collapse = getResources().getIdentifier( "ic_action_collapse_light","drawable", ma.getPackageName() );     
}

これは、フラグメントの onCreate で行います。実行時にアイコン ID を解決しなければならないのは残念ですが、それがどのように行われるかのようです。

この場合、アイコンが通常のサイズで表示され、ToggleButton の背景のレイヤーとして指定したときに 2 倍のサイズで表示される理由がわかりません (すべてのアイコンに ScaledDrawable リソースが必要です)。

これが私のonClickListenerです(TextView用):

protected OnClickListener expandCtrlListener = new OnClickListener() {
    public void onClick(View v) {
        assertTrue( v == expandCtrl );
        isExpanded = !isExpanded;
        advancedView.setVisibility( isExpanded ?  View.VISIBLE : View.GONE );
        expandCtrl.setCompoundDrawablesWithIntrinsicBounds( isExpanded ? icon_collapse : icon_expand, 0, 0, 0 );
    }
};

これには、展開/折りたたみのアニメーションは表示されないことに注意してください。それは、質問の最後にある記事で取り上げられています。

于 2013-09-13T01:23:48.890 に答える