删除 drawableTop 和文本之间的填充
Remove Padding between drawableTop and text
我有 CustomLayout,它有 TextView,我在上面以编程方式设置文本和可绘制对象,但是问题是当我设置可绘制对象时,它添加了一个巨大的填充,我想要的是可绘制对象更多地位于中心而不是在顶部。
自定义视图组
public class ProfileGridView extends FrameLayout {
public ProfileGridView(@NonNull Context context) {
super(context);
initView(context,null);
}
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context,attrs);
}
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context,attrs);
}
@TargetApi(21)
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context,attrs);
}
public void initView(Context context, AttributeSet attrs) {
TextView gridTextView;
View view = inflate(context, R.layout.square_grid, null);
gridTextView = (TextView) view.findViewById(R.id.grid_description);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProfileGridView);
Drawable drawable = array.getDrawable(R.styleable.ProfileGridView_drawble);
String description = array.getString(R.styleable.ProfileGridView_grid_description);
gridTextView.setText(description);
gridTextView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
addView(view);
array.recycle();
}
}
自定义视图布局文件
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:gravity="center"
android:padding="0dp"
android:textSize="20sp" />
MainActivit.xml
<RelativeLayout 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">
<com.example.views.ProfileGridView
android:layout_width="200dp"
android:layout_height="200dp"
app:drawble="@drawable/ic_message"
app:grid_description="Message"/>
</RelativeLayout>
这不是填充问题,因为您将可绘制对象的宽度和高度设置为 200dp
可以在可绘制文件中使用 "wrap_content" 吗?
如果不是只有图像文件并将其设置为 TextView 的可绘制对象
你能像这样使用 CustomView LayoutFile 吗?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/image"
android:layout_width="52dp"
android:layout_height="52dp" />
<TextView
android:id="@+id/grid_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="4dp"
android:textSize="20sp"/>
</LinearLayout>
并像这样设置可绘制对象
ImageView image;
image = (ImageView) view.findViewById(R.id.image);
image.setImageDrawable(drawable);
而不是
gridTextView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
编辑
如您所问,您可以制作 ProfileGridView wrap_content 而不是 200dp。使用 setCompoundDrawablesWithIntrinsicBounds,您可以将可绘制对象附加到 TextView (200dp) 的边界。 [您可以查看文档以获取更多信息](https://developer.android.com/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
将 drawableBottom 设置为大小相同的图像将使文本居中。这是一个可以解决问题的简单可绘制对象:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:width="24dp"
android:height="24dp"/>
</shape>
我有 CustomLayout,它有 TextView,我在上面以编程方式设置文本和可绘制对象,但是问题是当我设置可绘制对象时,它添加了一个巨大的填充,我想要的是可绘制对象更多地位于中心而不是在顶部。
自定义视图组
public class ProfileGridView extends FrameLayout {
public ProfileGridView(@NonNull Context context) {
super(context);
initView(context,null);
}
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context,attrs);
}
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context,attrs);
}
@TargetApi(21)
public ProfileGridView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context,attrs);
}
public void initView(Context context, AttributeSet attrs) {
TextView gridTextView;
View view = inflate(context, R.layout.square_grid, null);
gridTextView = (TextView) view.findViewById(R.id.grid_description);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProfileGridView);
Drawable drawable = array.getDrawable(R.styleable.ProfileGridView_drawble);
String description = array.getString(R.styleable.ProfileGridView_grid_description);
gridTextView.setText(description);
gridTextView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
addView(view);
array.recycle();
}
}
自定义视图布局文件
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:gravity="center"
android:padding="0dp"
android:textSize="20sp" />
MainActivit.xml
<RelativeLayout 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">
<com.example.views.ProfileGridView
android:layout_width="200dp"
android:layout_height="200dp"
app:drawble="@drawable/ic_message"
app:grid_description="Message"/>
</RelativeLayout>
这不是填充问题,因为您将可绘制对象的宽度和高度设置为 200dp
可以在可绘制文件中使用 "wrap_content" 吗?
如果不是只有图像文件并将其设置为 TextView 的可绘制对象
你能像这样使用 CustomView LayoutFile 吗?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/image"
android:layout_width="52dp"
android:layout_height="52dp" />
<TextView
android:id="@+id/grid_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="4dp"
android:textSize="20sp"/>
</LinearLayout>
并像这样设置可绘制对象
ImageView image;
image = (ImageView) view.findViewById(R.id.image);
image.setImageDrawable(drawable);
而不是
gridTextView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
编辑
如您所问,您可以制作 ProfileGridView wrap_content 而不是 200dp。使用 setCompoundDrawablesWithIntrinsicBounds,您可以将可绘制对象附加到 TextView (200dp) 的边界。 [您可以查看文档以获取更多信息](https://developer.android.com/reference/android/widget/TextView.html#setCompoundDrawablesWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
将 drawableBottom 设置为大小相同的图像将使文本居中。这是一个可以解决问题的简单可绘制对象:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:width="24dp"
android:height="24dp"/>
</shape>