希望我在这里不是很厚,但是我无法将TextView的基线与ConstraintLayout中的指南对齐。看来该指南没有基线,这非常令人讨厌。有谁知道我怎么做到这一点?这里有一些布局xml不起作用(这是在ConstraintLayout中):
<TextView
android:id="@+id/textToAlignBaseline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:maxLines="1"
android:paddingRight="6dp"
android:textAppearance="@style/TextStyles.Body"
app:layout_constraintBaseline_toBaselineOf="@+id/guidelineBottomMargin"
app:layout_constraintLeft_toLeftOf="parent" />
<Button
android:id="@+id/buttonToAlignBottom"
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_marginRight="20dp"
android:background="@drawable/selector_button_bg"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/clickme"
android:textAppearance="@style/TextStyles.Body"
app:layout_constraintBottom_toTopOf="@+id/guidelineBottomMargin"
app:layout_constraintRight_toRightOf="parent" />
<android.support.constraint.Guideline
android:id="@+id/guidelineBottomMargin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_end="20dp" />
答案 0 :(得分:2)
我想我可能想出了一个解决方案,我尝试扩展Baseline并从&#39; getBaseline&#39;中返回0。但是从未调用过,所以我尝试扩展AppCompatButton并返回&#39; getMeasuredHeight&#39;来自&#39; getBaseline&#39;相反(就像ImageView在使用&#39; baselineAlignBottom&#39;时那样),这似乎现在正常工作。 TextView只需更改以将其基线与按钮而不是指南对齐。我需要使用类似于ImageView的属性来清理它,但这是我现在所拥有的:
public class ButtonBottomBaseline extends android.support.v7.widget.AppCompatButton {
public ButtonBottomBaseline(Context context) {
super(context);
}
public ButtonBottomBaseline(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ButtonBottomBaseline(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public int getBaseline() {
return getMeasuredHeight();
}
}
答案 1 :(得分:1)
当我尝试根据Material Design实现两行列表时,我遇到了这个问题,其中“两行项目”基线应该从顶部算起32dp:
看起来像普通的sudo
或View
没有基线,因为它从Guideline
返回-1。所以我最终使用的是这样的不可见getBaseline
:
TextView
然后使用<TextView
android:id="@+id/guideline"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="32dp"
android:textSize="0sp"
android:visibility="invisible"
app:layout_constraintTop_toTopOf="parent" />
将另一个视图与其对齐。
答案 2 :(得分:0)
我找到了一种解决方法,可以按照 @robinst 提到的 Material Design 指南对齐文本。
首先添加一个ImageView,0为layout_width
,你想要的基线为layout_height
,没有src
,baselineAlignBottom
设置为true
< /强>:
<ImageView
android:id="@+id/typeTextBaseline"
android:layout_width="0dp"
android:layout_height="24dp"
android:baselineAlignBottom="true"
android:visibility="invisible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
然后你可以将你的 TextView 的基线与这个 ImageView 的基线对齐:
<TextView
android:id="@+id/typeTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.MaterialComponents.Overline"
app:layout_constraintBaseline_toBaselineOf="@id/typeTextBaseline"
app:layout_constraintStart_toStartOf="parent" />
我在搜索 View 的 getBaseline
方法的所有实现时发现了这个解决方法,ImageView 的实现如下:
public int getBaseline() {
if (mBaselineAlignBottom) {
return getMeasuredHeight();
} else {
return mBaseline;
}
}
因此,一旦您将 baselineAlignBottom
设置为 true
,ImageView 的基线将成为其底部边缘,并且现在神奇地用作指导:)