【问题标题】:LinearLayout horizontally align textview to center of button inside linearlayout vertical orientationLinearLayout 将文本视图水平对齐到线性布局垂直方向内的按钮中心
【发布时间】:2019-12-08 14:39:09
【问题描述】:

我有一个垂直方向的 LinearLayout。 它有两个子元素 - 一个 TextView 和一个 Button。 该按钮将与父级的右/端对齐。 并且 textView 必须对齐,以便两个兄弟姐妹的中心匹配。

约束: 由于某些原因,不允许使用 RelativeLayout。 允许使用 ConstraintLayout。我认为这可能会有所帮助。 (虽然我想尽可能避免增加复杂性。)

这可以实现吗? 如果是,如何实现?

这是我的 activity_main.xml 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:id="@+id/frame_layout_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         tools:context=".MainActivity"
         tools:layout_height="400dp">

<View android:layout_width="match_parent"
      android:layout_height="400dp"
      android:background="@color/green">
</View>

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:baselineAligned="false"
        android:orientation="horizontal">

    <LinearLayout
            android:id="@+id/left_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="start|bottom"
            android:layout_weight="0.65"
            android:gravity="start"
            android:orientation="vertical">

        <TextView
                android:id="@+id/textViewTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:paddingBottom="8dp"
                android:textAlignment="viewStart"
                android:textColor="@color/white"
                android:text="John Mayer Doe"
                android:textSize="20sp"
                tools:text="Title"/>

        <TextView
                android:id="@+id/textViewSubTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:autoSizeTextType="uniform"
                android:ellipsize="end"
                android:maxLines="2"
                android:minLines="1"
                android:paddingBottom="8dp"
                android:textAlignment="viewStart"
                android:textColor="@color/white"
                android:textSize="15sp"
                android:text="Alice Bob Charlie Dave Eve Frank"
                tools:text="Subtitle"/>
    </LinearLayout>
    <LinearLayout
            android:id="@+id/right_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:layout_weight="0.35"
            android:gravity="center_horizontal|end"
            android:orientation="vertical">

        <TextView
                android:id="@+id/textontopofbutton"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:layout_marginStart="4dp"
                android:layout_marginEnd="4dp"
                android:gravity="center_horizontal"
                android:textAlignment="center"
                android:textColor="@color/black"
                android:text="text on top"
                tools:text="on top of button"/>

        <Button
                android:id="@+id/bottomrightbutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:layout_margin="4dp"
                android:textAlignment="center"
                android:textColor="@color/white"
                android:background="@color/colorAccent"
                android:text="Click me now"
                tools:text="Tap here now"/>
    </LinearLayout>
</LinearLayout>

用于参考的colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="colorAccentBright">#D81B60</color>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
<color name="green">#3D9D2A</color>
<color name="red">#D80D15</color>
<color name="yellow">#B7AB4C</color>
<color name="maroon">#BB4767</color>
</resources>

MainActivity.kt

package com.example.flames

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

截图: 使用布局边界:

目标: 我希望“顶部的文本”与按钮居中对齐。

感谢您的帮助。谢谢。

【问题讨论】:

  • 你完全可以用约束布局来做到这一点。您是否尝试自己将其更改为ConstraintLayout
  • 尝试将bottomrightbutton宽度更改为match_parent
  • @BachVu 我不希望按钮占据右侧边栏的整个宽度,所以这是不可接受的。按钮必须使用 wrap_content,问题是关于 textview 相对于 buttonview 中心的对齐方式,与 buttonview 的大小无关。

标签: android android-layout alignment android-linearlayout android-framelayout


【解决方案1】:

是的,您可以轻松地使用 ConstraintLayout 以最小的复杂性完成,

这是你可以尝试的解决方案,

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">

    <View
        android:id="@+id/view5"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="@color/green"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:paddingBottom="8dp"
        android:text="John Mayer Doe"
        android:textAlignment="viewStart"
        android:textColor="@color/white"
        android:textSize="20sp"
        app:layout_constraintBottom_toTopOf="@+id/textViewSubTitle"
        app:layout_constraintStart_toStartOf="@+id/view5" />

    <TextView
        android:id="@+id/textViewSubTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:autoSizeTextType="uniform"
        android:ellipsize="end"
        android:maxLines="2"
        android:minLines="1"
        android:paddingBottom="8dp"
        android:text="Alice Bob Charlie Dave Eve Frank"
        android:textAlignment="viewStart"
        android:textColor="@color/white"
        android:textSize="15sp"
        app:layout_constraintBottom_toBottomOf="@+id/view5"
        app:layout_constraintStart_toStartOf="@+id/view5" />

    <TextView
        android:id="@+id/textontopofbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="8dp"
        android:gravity="center_horizontal"
        android:text="text on top"
        android:textAlignment="center"
        android:textColor="@color/black"
        app:layout_constraintBottom_toTopOf="@+id/bottomrightbutton"
        app:layout_constraintEnd_toEndOf="@+id/bottomrightbutton"
        app:layout_constraintStart_toStartOf="@+id/bottomrightbutton" />

    <Button
        android:id="@+id/bottomrightbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_margin="4dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/colorAccent"
        android:text="Click me now"
        android:textAlignment="center"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="@+id/view5"
        app:layout_constraintEnd_toEndOf="@+id/view5" />

</android.support.constraint.ConstraintLayout>

【讨论】:

  • 我将这两个都添加到 gradle 依赖项,实现 'androidx.constraintlayout:constraintlayout:1.1.3' 和实现 'com.android.support.constraint:constraint-layout:1.1.3',但是应用程序崩溃。我还添加了multidex,并且multidexenabled true,我还缺少什么吗?
  • 请仅添加单个依赖项,使用的androidx或支持库。
  • 好的,我只添加了一个“implementation 'androidx.constraintlayout:constraintlayout:1.1.3'”,然后 UI 顶部的文本位置错误,截图在 imgur.com/lVOKBCR
  • 我在上面的代码中使用了实现 'com.android.support.constraint:constraint-layout:2.0.0-beta2' 没有你提到的问题。你能再检查一下吗
【解决方案2】:

是的,你可以这样做

<LinearLayout
    android:id="@+id/right_overlay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textontopofbutton"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:layout_marginStart="4dp"
        android:layout_marginEnd="4dp"
        android:textAlignment="center"
        android:text="text on top"/>

    <Button
        android:id="@+id/bottomrightbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="4dp"
        android:textAlignment="center"
        android:textColor="@color/white"
        android:background="@color/colorAccent"
        android:text="Click me now"
        tools:text="Tap here now"/>
</LinearLayout>

或使用约束布局

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/textontopofbutton"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:layout_marginStart="4dp"
    android:layout_marginEnd="4dp"
    android:text="text on top"
    android:textAlignment="center"
    app:layout_constraintBottom_toTopOf="@+id/bottomrightbutton"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/bottomrightbutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="4dp"
    android:background="@color/colorAccent"
    android:text="Click me now"
    android:textAlignment="center"
    android:textColor="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textontopofbutton"
    tools:text="Tap here now" />

【讨论】:

  • 使用线性布局的解决方案没有按预期工作,使用约束布局的解决方案工作正常,谢谢
  • 很高兴能帮上忙
【解决方案3】:

我对您的 XML 做了一个非常小的修复,这应该可以工作。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/frame_layout_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity"
    tools:layout_height="400dp">

    <View android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="@color/green">
    </View>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:baselineAligned="false"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/left_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="start|bottom"
            android:layout_weight="0.65"
            android:gravity="start"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textViewTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:paddingBottom="8dp"
                android:textAlignment="viewStart"
                android:textColor="@color/white"
                android:text="John Mayer Doe"
                android:textSize="20sp"
                tools:text="Title"/>

            <TextView
                android:id="@+id/textViewSubTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:autoSizeTextType="uniform"
                android:ellipsize="end"
                android:maxLines="2"
                android:minLines="1"
                android:paddingBottom="8dp"
                android:textAlignment="viewStart"
                android:textColor="@color/white"
                android:textSize="15sp"
                android:text="Alice Bob Charlie Dave Eve Frank"
                tools:text="Subtitle"/>
        </LinearLayout>
        <LinearLayout
            android:id="@+id/right_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:layout_weight="0.35"
            android:gravity="center_horizontal|end"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textontopofbutton"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="end"
                android:layout_margin="4dp"
                android:textAlignment="center"
                android:textColor="@color/black"
                android:text="text on top"
                tools:text="on top of button"/>

            <Button
                android:id="@+id/bottomrightbutton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:layout_margin="4dp"
                android:textAlignment="center"
                android:textColor="@color/white"
                android:background="@color/colorAccent"
                android:text="Click me now"
                tools:text="Tap here now"/>
        </LinearLayout>
    </LinearLayout>

一切顺利:)

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2019-04-10
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多