将视图动态添加到高度为 wrap_content 的 LinearLayout 不显示任何内容
Dynamically adding a View to a LinearLayout with height of wrap_content doesn't display anything
我正在尝试使用 wrap_content
高度将视图动态添加到 LinearLayout
。但是它不起作用,除非我添加定义的 dp
高度,例如 300dp
。为什么我不能以编程方式添加视图并让父视图 LinearLayout
包装内容?
我要添加的视图:
public class ImageCanvas extends View {
private static final String TAG = "ImageCanvas";
private Bitmap icon;
public ImageCanvas(Context context) {
super(context);
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.piggy);
if(drawable != null){
icon = ((BitmapDrawable) drawable).getBitmap();
}
Log.d(TAG, "ImageCanvas: " + icon);
}
public ImageCanvas(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ImageCanvas(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(icon, 0, 0, null);
}
}
LinearLayout
我正在尝试将以上视图添加到:
<LinearLayout
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingBottom="32dp"
android:orientation="vertical"
android:paddingTop="32dp"/>
以编程方式创建视图并添加它:
LinearLayout drawingPad = findViewById(R.id.drawingPad);
ImageCanvas imageCanvas = new ImageCanvas(context);
drawingPad.addView(imageCanvas);
当我将 XML LinearLayout 设置为像 200dp
这样的定义高度时它可以工作,但它不适用于 wrap_content
,我怎样才能做到这一点 wrap_content
?
_________________________________________________________
更新 1:
我将所有内容简化为 XML 布局,结果问题出在父级 NestedScrollView
。
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_create_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="Create image"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="32dp"
android:paddingBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
这是整个布局。当您添加 NestedScrollView
并尝试以编程方式添加视图时,位图将不会在屏幕上绘制。当您删除 NestedScrollView
时,位图将出现。如果有人知道如何使用 NestedScrollView
请分享!
问题可能出在您的约束布局上。
对于约束布局 >= 1.1
app:layout_constrainedHeight=”true"
android:layout_height="wrap_content"
用于约束布局 <1.1
android:layout_height="wrap_content"
app:layout_constraintHeight_default="wrap"
这总是让我感动,也许它让你感动。
(编辑)这需要在约束布局的子项中而不是约束布局本身,即 LinearLayout。
您需要提供具有 onMeasure()
覆盖的 ImageCanvas 的尺寸:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(icon.getWidth(),icon.getHeight());
}
当您明确提供高度时,该高度将在自定义组件中设置。对于 wrap content,高度被设置为零,因为它既没有指定也没有明确测量。上面的代码将提供正确的测量结果。
(icon.getHeight()
是您真正需要的,对应于 wrap_content
。根据您的设计,您可能需要不同的 icon.getWidth()
值。)
不确定为什么 NestedScrollView 有任何效果,但上面的代码会有所帮助。
我正在尝试使用 wrap_content
高度将视图动态添加到 LinearLayout
。但是它不起作用,除非我添加定义的 dp
高度,例如 300dp
。为什么我不能以编程方式添加视图并让父视图 LinearLayout
包装内容?
我要添加的视图:
public class ImageCanvas extends View {
private static final String TAG = "ImageCanvas";
private Bitmap icon;
public ImageCanvas(Context context) {
super(context);
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.piggy);
if(drawable != null){
icon = ((BitmapDrawable) drawable).getBitmap();
}
Log.d(TAG, "ImageCanvas: " + icon);
}
public ImageCanvas(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ImageCanvas(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(icon, 0, 0, null);
}
}
LinearLayout
我正在尝试将以上视图添加到:
<LinearLayout
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingBottom="32dp"
android:orientation="vertical"
android:paddingTop="32dp"/>
以编程方式创建视图并添加它:
LinearLayout drawingPad = findViewById(R.id.drawingPad);
ImageCanvas imageCanvas = new ImageCanvas(context);
drawingPad.addView(imageCanvas);
当我将 XML LinearLayout 设置为像 200dp
这样的定义高度时它可以工作,但它不适用于 wrap_content
,我怎样才能做到这一点 wrap_content
?
_________________________________________________________
更新 1:
我将所有内容简化为 XML 布局,结果问题出在父级 NestedScrollView
。
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_create_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="Create image"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="32dp"
android:paddingBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
这是整个布局。当您添加 NestedScrollView
并尝试以编程方式添加视图时,位图将不会在屏幕上绘制。当您删除 NestedScrollView
时,位图将出现。如果有人知道如何使用 NestedScrollView
请分享!
问题可能出在您的约束布局上。 对于约束布局 >= 1.1
app:layout_constrainedHeight=”true"
android:layout_height="wrap_content"
用于约束布局 <1.1
android:layout_height="wrap_content"
app:layout_constraintHeight_default="wrap"
这总是让我感动,也许它让你感动。 (编辑)这需要在约束布局的子项中而不是约束布局本身,即 LinearLayout。
您需要提供具有 onMeasure()
覆盖的 ImageCanvas 的尺寸:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(icon.getWidth(),icon.getHeight());
}
当您明确提供高度时,该高度将在自定义组件中设置。对于 wrap content,高度被设置为零,因为它既没有指定也没有明确测量。上面的代码将提供正确的测量结果。
(icon.getHeight()
是您真正需要的,对应于 wrap_content
。根据您的设计,您可能需要不同的 icon.getWidth()
值。)
不确定为什么 NestedScrollView 有任何效果,但上面的代码会有所帮助。