我正在使用此ExpandableView组件https://github.com/nicolasjafelle/ExpandableView
组件包装用户指定的其他自定义组件。当自定义组件具有固定高度时,一切正常。
但是,我正在创建一个具有动态行数的自定义组件。假设这是初始状态:
this is row1
this is row2
this is row3
button
当我点击按钮时,它会显示
this is row1
this is row2
this is row3
this is row4
button
当我在LinearLayout中测试我的组件时,没有问题,并显示新行。但是,当我在ExpandableView中嵌入我的自定义组件时,ExpandableView的ContentView不会扩展以包装新行,而是隐藏在底部的按钮。
我想允许ExpandableView的ContentView根据内部自定义组件的大小动态扩展我应该实现ExpandableView的onMeasure()方法。但到目前为止,我所有的测试都失败了。
我的自定义组件的层次结构是:
有什么想法吗?
我想这是ExpandableView组件中的一个错误,但不知道如何修复它。
更多细节:这是实例化ExpandableView的代码:
ExpandableView expandableContract = (ExpandableView) formsContained.findViewById(R.id.expandable_academy);
expandableContract.fillData(R.drawable.button_selected_full, getStringResource(R.string.about_academy), false);
expandableContract.addContentView(getLayoutInflater().inflate(R.layout.activity_offer_form_academy, new ExpandableView(this), true));
其中R.layout.activity_offer_form_academy只是我的组件的布局:
<com.dynassets.assets.util.weektimes.WeekTimes
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/weektimes"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
我的自定义组件的代码是
public class WeekTimes extends LinearLayout {
public WeekTimes(Context context) {
super(context);
init();
}
public WeekTimes(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
setOrientation(LinearLayout.VERTICAL);
Button button = new Button(getContext());
button.setText("click me");
addView(button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
Button button = new Button(getContext());
button.setText("click me2");
addView(button);
requestLayout();
} catch (Exception e) {
Log.e("MyApp", "exception", e);
}
}
});
}
}
那么,如何告诉父ExpandableView根据孩子的身高进行扩展?这是创建onMeasure()方法的问题吗?
答案 0 :(得分:0)
嗯,问题是ExpandableView包含一个动画,这个动画正在修复高度,防止android布局按预期工作。这里有更详细的描述:
https://github.com/nicolasjafelle/ExpandableView/issues/5
因此修复程序会在动画结束后将高度重新分配给相对值。通过在动画方法上的ExpandableView扩展上添加这些新行来修复问题:
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// release height
ViewGroup.LayoutParams layoutParams = contentLayout.getLayoutParams();
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
contentLayout.setLayoutParams(layoutParams);
}
});