I’m trying to show a MyCustomLinearLayout which extends LinearLayout. I’m inflating the MyCustomLinearLayout with the android:layout_height="match_parent" attribute.
What I want is to show an ImageView in this MyCustomLinearLayout. The height of this ImageView should be match_parent, and the width should be equal to the height. I’m trying to accomplish this by overriding the onMeasure() method. What happens, is that MyCustomLinearLayout does become square like it should, but the ImageView is not showing.
Below my used code. Please note that this is an extremely simplified version of my problem. The ImageView will be replaced by a more complex component.
public MyCustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_myimageview, this);
setBackgroundColor(getResources().getColor(R.color.blue));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(height, height);
}
The view_myimageview.xml file:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<ImageView
android:id="@+id/view_myimageview_imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher" />
</merge>
So when I override the onMeasure() method, the ImageView is not showing, when I don’t override the onMeasure() method, the ImageView shows, but way too small, because the MyCustomLinearLayout‘s width is too small.
That’s not how you override the
onMeasuremethod especially of a default SDK layout. Right now with your code you just made theMyCustomLinearLayoutsquare assigning it a certain value. But, you didn’t measured its children so they are sizeless and don’t appear on the screen.I’m not sure this would work but try this:
Of course this will basically do the work of
onMeasuretwice but theImageViewshould be now visible filling it’s parent. There are other solutions but your question is a bit scarce on details.