我知道我们可以为android:gravity
和 android:layout_gravity
属性设置以下值:
center
center_vertical
center_horizontal
等但我对这两个问题感到困惑.
使用android:gravity
和有android:layout_gravity
什么区别?
我在TextView中添加了Drawable start图像.问题是我无法控制TextView中Drawable的重力
到目前为止我取得了什么
这是我的TextView
<TextView
android:id="@+id/tv_8_digit_check"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="@dimen/dimen_4"
android:drawableStart="@drawable/ic_validate"
android:text="@string/at_least_8_characters_txt"
android:textColor="@color/white_trans"
android:textSize="12sp" />
Run Code Online (Sandbox Code Playgroud)
关于如何将Drawable的重力设置为顶部/开始的任何建议?谢谢
android textview android-layout android-drawable android-gravity
问题
我有一个自定义的Android视图,我想让用户设置重力以布局内容onDraw
.这是我正在使用的简化版本onDraw
:
// check gravity
if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) {
// draw the content centered vertically
} else if ((mGravity & Gravity.BOTTOM) == Gravity.BOTTOM) {
// draw the content at the bottom
}
Run Code Online (Sandbox Code Playgroud)
其中mGravity
从XML属性(获得这样).
如果我将引力设置为Gravity.CENTER_VERTICAL
它可以正常工作.但我很惊讶地发现,如果我把它设置为Gravity.BOTTOM
,那么Gravity.CENTER_VERTICAL
检查仍然是真的!
为什么会这样?
我必须查看二进制值才能看出原因:
0001 0000
, Gravity.CENTER_VERTICAL
:常量值:16(0x00000010)0101 0000
, Gravity.BOTTOM
:常量值:80(0x00000050)因此,当我这样做
mGravity = Gravity.BOTTOM;
(mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL
// (0101 & 0001) == 0001 …
Run Code Online (Sandbox Code Playgroud) 我正在使用TextInputLayout来显示提示,但我无法将其垂直居中.我总是得到这个:
当EditText/TextInputEditText中没有文本时,我想垂直居中.我尝试过基本的想法(重力,layout_gravity等).到目前为止,唯一的方法是添加一些"魔术"填充,但我想以更清洁的方式做到这一点.我正在考虑测量顶部提示标签高度,并在它不可见时将其添加为底部边距,并在可见时删除相同的边距,但我还不太了解TextInputLayout源代码.有谁知道怎么做?
编辑:
我试过这个建议的答案:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/grey_strong">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="90dp"
android:background="@color/red_light"
android:gravity="center_vertical"
android:hint="Test"/>
</android.support.design.widget.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
"大"提示仍然没有垂直居中.它略低于中心,因为"小"提示(在灰色背景中,在顶部,仅在场聚焦时可见)在顶部占据一些空间并推动EditText.
android android-edittext android-textinputlayout android-gravity
目前它看起来像附加此布局:
<android.support.design.widget.TextInputLayout
android:id="@+id/layoutCurrentPW"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:errorEnabled="true">
Run Code Online (Sandbox Code Playgroud)
如何设置错误信息"密码必须至少为8个字符"到中心引力?
我尝试使用android:gravity ="center",但这不起作用.
编辑
包含EditText的布局:
<android.support.design.widget.TextInputLayout
android:id="@+id/layoutCurrentPW"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:errorEnabled="true">
<EditText
android:id="@+id/editTextCurrentPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:gravity="center"
android:hint="@string/current_password"
android:inputType="textPassword"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/black" />
</android.support.design.widget.TextInputLayout>
Run Code Online (Sandbox Code Playgroud) 在使用RTL语言(阿拉伯语)的设备上测试我的布局时,我发现带有重力的TextView:start始终将文本对齐而不是右对齐!我试过android:textAlignment ="viewStart"并且它正常工作但由于API reqs我不依赖它.
我的代码(我的意思是代码中的第一个textview):
<LinearLayout
android:orientation="horizontal"
android:gravity="center_vertical"
>
<TextView
android:text="Size"
android:gravity="start"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<LinearLayout android:gravity="center" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView
android:text="000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="subtext"/>
</LinearLayout></LinearLayout>
Run Code Online (Sandbox Code Playgroud) 我创建了一个扩展 MaterialButton 的自定义视图,在加载时用 CircularProgressIndicator 替换可绘制对象。
但是,当我用 CircularProgressIndicator 替换可绘制对象时, iconGravity 不再起作用。我不明白我做错了什么。
我已经能够将课程归结为:
class LoadingButton constructor(context: Context) : MaterialButton(context) {
private val progressIndicatorDrawable by lazy {
val progressIndicatorSpec = CircularProgressIndicatorSpec(context, null, 0, R.style.Widget_MaterialComponents_CircularProgressIndicator_ExtraSmall)
progressIndicatorSpec.indicatorColors = intArrayOf(getColor(context, R.color.white))
IndeterminateDrawable.createCircularDrawable(context, progressIndicatorSpec).apply {
setVisible(true, true)
}
}
init {
// the following drawable is aligned to the start of the view (incorrect).
icon = progressIndicatorDrawable
// the following drawable is aligned to the start of the text (correct).
// icon = DrawableUtil.getDrawable(context, R.drawable.icon_delete)
text = …
Run Code Online (Sandbox Code Playgroud) android progress-indicator android-gravity material-components material-components-android
如何使图像和文本对齐方式与 SwiftUI LazyVGrid 中的其他 3 个对齐方式相同,如下图所示?
我认为问题是如果文本是多行的,如何使文本从顶部开始。在Android中,我可以使用gravity =“top | center”,但在SwiftUI中,我使用.multilineTextAlignment(.center),但结果并不像我预期的那样。
这是我在代码中尝试的内容:
LazyVGrid(columns: gridItemLayout, spacing: 0) {
ForEach((0...7), id: \.self) { i in
VStack {
RemoteImageView(url: vm.listService[i].image_uri)
.frame(width: 100, height: 100)
Text(vm.listService[i].name)
.font(.body)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, alignment: .center)
}
}
}
.padding(.horizontal, 25.0)
Run Code Online (Sandbox Code Playgroud) 我想使用包含2张图像的splah屏幕:
我的泼溅的XML是:
<?xml version="1.0" encoding="utf-8" ?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/ComplementColor" />
<padding
android:left="0dip"
android:top="0dip"
android:right="0dip"
android:bottom="0dip" />
</shape>
</item>
<item>
<bitmap android:src="@drawable/main_logo"
android:gravity="center" />
</item>
<item>
<bitmap android:src="@drawable/secondary_logo"
android:gravity="bottom" />
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud) 我正在创建一个ProgressBar放置在LinearLayout的垂直中心(其他布局不起作用;我需要使用LinearLayout).这是一些代码:
LinearLayout linearLayout = new LinearLayout(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
linearLayout.setLayoutParams(layoutParams);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setGravity(Gravity.CENTER);
//add progressbar
ProgressBar progressBar = new ProgressBar(context);
progressBar.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
linearLayout.addView(progressBar);
Run Code Online (Sandbox Code Playgroud)
我有一个ContainerView,它将保存上面创建的LinearLayout.像这样的东西:
public class ContainerView extends ScrollView {
public ContainerView(Context context) {
super(context);
initView(context);
}
private void initView(Context context){
addView(linearLayout); //which is created in the snippet above
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用LinearLayout扩展ContainerView,一切正常.
如果我使用ScrollView扩展ContainerView,则ProgressBar水平居中但不垂直居中.
这种双重行为背后的原因是什么?我的目标是在下载一些数据时显示ProgressBar; 下载数据后,我需要在LinearLayout中显示它.
(注意:使用ScrollView的原因是下载的数据可能太大而不适合小屏幕.这可能看起来像ListView的用例,但还有一些其他原因阻止我使用ListView.)
android scrollview android-layout layout-gravity android-gravity
android-gravity ×10
android ×9
bitmap ×1
flags ×1
gridview ×1
image ×1
java ×1
lazyhgrid ×1
lazyvgrid ×1
material-components-android ×1
scrollview ×1
swiftui ×1
textview ×1