我需要一个 UI 元素,允许用户展开/折叠(显示/隐藏)包含可选/高级信息的 View 。
我将其设想为一个文本标签(例如“高级选项”、“更多/更少”)加上一个在打开和关闭之间切换的图标。我有一些可以达到目的的图标,并且该元素的功能与 ToggleButton 的功能非常匹配,因此我尝试使用样式化的 ToggleButton 来解决这个问题。
这个解决方案非常丑陋(从维护的角度来看)。我会将其添加为下面的答案。
我希望有人可以提出更好的解决方案,或者指出如何简化我的解决方案。
顺便说一句,在 this SO Q/A 中很好地解决了 View 展开/折叠的动画问题。 .
最佳答案
谢天谢地,我找到了一种更简单的方法。
我没有使用 ToggleButton(涉及 11 个资源文件来设置样式),而是使用带有 CompoundDrawable 的 TextView,然后自己管理状态。
这种方式代码量稍微多一点,但是省去了一大堆乱七八糟的资源文件。它还可以更轻松地处理多个主题,例如在这里,我根据主题为所需的图标设置了资源 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() );
}
我在 fragment 的 onCreate 中执行此操作。不幸的是,我必须在运行时解析图标 ID,但这似乎是如何完成的。
我不知道为什么我的图标在这种情况下以正常大小显示,而当我将它们指定为 ToggleButton 的背景层时(这需要为我的所有图标提供 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 );
}
};
请注意,这些都没有显示展开/折叠的动画。我在问题末尾提到的文章中提到了这一点。
关于android - Android 中的展开/折叠按钮(显示/隐藏可选 View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772984/