ありがたいことに、もっと簡単な方法を見つけました。
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 );
}
};
これには、展開/折りたたみのアニメーションは表示されないことに注意してください。それは、質問の最後にある記事で取り上げられています。