首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TextView的基线与约束布局中的基准线对齐

将TextView的基线与约束布局中的基准线对齐
EN

Stack Overflow用户
提问于 2017-11-28 18:55:43
回答 3查看 1.7K关注 0票数 4

希望我在这里不是完全笨拙的,但我无法将TextView的基线与ConstraintLayout中的指南对齐。该指南似乎没有基线,这是相当恼人的。有谁知道我是怎么做到这一点的吗?下面是一些不起作用的布局xml (这是在ConstraintLayout中):

代码语言:javascript
复制
                 <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" />
EN

回答 3

Stack Overflow用户

发布于 2019-03-26 18:11:39

当我试图根据Material Design实现一个两行列表时,我遇到了这个问题,其中“两行项目”基线应该是从顶部开始的32dp:

它看起来像一个普通的ViewGuideline没有基线,因为它从getBaseline返回-1。所以我最终使用了一个看不见的TextView,如下所示:

代码语言:javascript
复制
<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" />

然后使用app:layout_constraintBaseline_toBaselineOf="@id/guideline"将另一个视图与其对齐。

票数 4
EN

Stack Overflow用户

发布于 2017-11-28 19:09:54

我想我可能已经想出了一个解决方案,我尝试扩展基线并从'getBaseline‘返回0,但从未被调用,所以我尝试扩展AppCompatButton,并从'getBaseline’返回'getMeasuredHeight‘(就像使用'baselineAlignBottom’时ImageView所做的那样),现在似乎可以正常工作了。TextView只需要更改以使其基线与按钮对齐,而不是与指南对齐。我需要用类似于ImageView的属性来清理它,但这就是我现在得到的:

代码语言:javascript
复制
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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-02 00:03:21

我已经找到了一种解决方法,可以完全按照@robinst提到的Material Design指南来对齐文本。

首先添加一个ImageView,将0设置为layout_width,将所需基线设置为layout_height,不添加src,并将baselineAlignBottom 设置为 baseline

代码语言:javascript
复制
<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的基线对齐:

代码语言:javascript
复制
<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的实现如下所示:

代码语言:javascript
复制
public int getBaseline() {
    if (mBaselineAlignBottom) {
        return getMeasuredHeight();
    } else {
        return mBaseline;
    }
}

因此,一旦您将baselineAlignBottom设置为true,ImageView的基线就变成了它的底边,它现在神奇地被用作指导方针:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47529824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档