将TextView的基线与约束布局中的指南对齐

时间:2017-11-28 10:55:43

标签: android android-layout android-constraintlayout

希望我在这里不是很厚,但是我无法将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" />

3 个答案:

答案 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:

Material Design spec

看起来像普通的sudoView没有基线,因为它从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,没有srcbaselineAlignBottom设置为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 的基线将成为其底部边缘,并且现在神奇地用作指导:)