Android 复合视图:无法使 child 视图匹配 parent
Android Compound View: cannot make child view match parent
我创建了一个自定义视图(复合视图),它继承自 FrameLayout,其中包含多个 child 视图:
MediaComponentView.java:
final public class MediaComponentView extends FrameLayout {
private int ratio = 1;
private ImageView imageView;
private CircularProgressView progressView;
private View downloadButton;
private View cancelButton;
private View playButton;
public MediaComponentView(Context context) {
super(context);
initializeViews();
}
public MediaComponentView(Context context, AttributeSet attrs) {
super(context, attrs);
initializeViews();
}
public MediaComponentView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeViews();
}
private void initializeViews() {
inflate(getContext(), R.layout.view_media_component, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
imageView = (ImageView) this.findViewById(R.id.image_view);
progressView = (CircularProgressView) this.findViewById(R.id.progress_view);
downloadButton = this.findViewById(R.id.download_button);
cancelButton = this.findViewById(R.id.cancel_button);
playButton = this.findViewById(R.id.play_button);
}
public void setRatio(int ratio) {
this.ratio = ratio;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth() / ratio);
}
}
view_media_component.xml:
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
app:riv_border_color="#eee"
app:riv_border_width="1px"
app:riv_corner_radius="3dp"
/>
<com.github.rahatarmanahmed.cpv.CircularProgressView
android:id="@+id/progress_view"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:visibility="gone"
/>
<ImageView
android:id="@+id/download_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/icon_chat_media_download"
android:visibility="gone"
/>
<ImageView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@android:drawable/ic_menu_close_clear_cancel"
android:visibility="gone"
/>
<ImageView
android:id="@+id/play_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/icon_chat_media_play"
android:visibility="gone"
/>
</merge>
复合视图的用法:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="4dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
>
<some.hidden.package.MediaComponentView
android:id="@+id/media_0"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="#00ff00"
/>
<some.hidden.package.MediaComponentView
android:id="@+id/media_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="#ff0000"
/>
</LinearLayout>
问题是 "image_view" 布局不正确。它不匹配 parent.
我已通过设置背景检查 MediaComponentView 本身的大小是否正确。它的尺寸正确。
但是 child 视图的大小不正确。我想这是因为 MediaComponentView 中重写了 onMeasure() 方法。
如有任何帮助或解释,我们将不胜感激。
您需要在 onMeasure() 覆盖结束时调用 measureChildren(int widthMeasureSpec, int heightMeasureSpec)。子视图不知道你改变了高度。
我创建了一个自定义视图(复合视图),它继承自 FrameLayout,其中包含多个 child 视图:
MediaComponentView.java:
final public class MediaComponentView extends FrameLayout {
private int ratio = 1;
private ImageView imageView;
private CircularProgressView progressView;
private View downloadButton;
private View cancelButton;
private View playButton;
public MediaComponentView(Context context) {
super(context);
initializeViews();
}
public MediaComponentView(Context context, AttributeSet attrs) {
super(context, attrs);
initializeViews();
}
public MediaComponentView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeViews();
}
private void initializeViews() {
inflate(getContext(), R.layout.view_media_component, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
imageView = (ImageView) this.findViewById(R.id.image_view);
progressView = (CircularProgressView) this.findViewById(R.id.progress_view);
downloadButton = this.findViewById(R.id.download_button);
cancelButton = this.findViewById(R.id.cancel_button);
playButton = this.findViewById(R.id.play_button);
}
public void setRatio(int ratio) {
this.ratio = ratio;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth() / ratio);
}
}
view_media_component.xml:
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
app:riv_border_color="#eee"
app:riv_border_width="1px"
app:riv_corner_radius="3dp"
/>
<com.github.rahatarmanahmed.cpv.CircularProgressView
android:id="@+id/progress_view"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:visibility="gone"
/>
<ImageView
android:id="@+id/download_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/icon_chat_media_download"
android:visibility="gone"
/>
<ImageView
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@android:drawable/ic_menu_close_clear_cancel"
android:visibility="gone"
/>
<ImageView
android:id="@+id/play_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/icon_chat_media_play"
android:visibility="gone"
/>
</merge>
复合视图的用法:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="4dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
>
<some.hidden.package.MediaComponentView
android:id="@+id/media_0"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="#00ff00"
/>
<some.hidden.package.MediaComponentView
android:id="@+id/media_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:background="#ff0000"
/>
</LinearLayout>
问题是 "image_view" 布局不正确。它不匹配 parent.
我已通过设置背景检查 MediaComponentView 本身的大小是否正确。它的尺寸正确。
但是 child 视图的大小不正确。我想这是因为 MediaComponentView 中重写了 onMeasure() 方法。
如有任何帮助或解释,我们将不胜感激。
您需要在 onMeasure() 覆盖结束时调用 measureChildren(int widthMeasureSpec, int heightMeasureSpec)。子视图不知道你改变了高度。