【问题标题】:Centering text to center in parent but not in TextView将文本居中在父级居中但不在 TextView 中
【发布时间】:2020-05-15 12:14:21
【问题描述】:

我有一个工具栏视图的布局,其中左侧有一个 ImageView,中间有一个 TextView,右侧有一个零,一个或两个 ImageView。而且我需要将 TextView 的文本居中放在窗口的中心,而不是在左右图标之间的空间中心。

这是我的布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="match_parent"
    android:layout_height="?attr/actionBarSize"
    tools:background="@color/darkGreyTextColor">

    <ImageView
        android:id="@+id/leftIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:src="@drawable/ic_hamburger" />

    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/rightBarrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="left"
        app:constraint_referenced_ids="rightFirstIcon,rightSecondIcon" />

    <ImageView
        android:id="@+id/rightFirstIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="@+id/rightSecondIcon"
        app:layout_constraintEnd_toStartOf="@+id/rightSecondIcon"
        app:layout_constraintTop_toTopOf="@+id/rightSecondIcon"
        tools:srcCompat="@drawable/ic_locate"
        tools:visibility="visible" />

    <ImageView
        android:id="@+id/rightSecondIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@drawable/ic_search"
        tools:visibility="visible" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.5" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:maxLines="1"
        android:text="@{viewModel.navigationStatus.topNavigationTitle}"
        android:textColor="@color/white"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/rightBarrier"
        app:layout_constraintStart_toEndOf="@+id/leftIcon"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Test small text"
        tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>

结果是

但我可以更改右侧图标的可见性,视图将如下所示: 要么

我需要做什么才能始终将 TextView 中的文本居中以在窗口上居中?

【问题讨论】:

    标签: android android-studio android-layout android-constraintlayout


    【解决方案1】:

    一个选项可能是,使用全宽创建带有编辑文本的布局。然后在另一个布局中添加 Imageviews 及其方向。最后将第二个布局放在第一个布局之上。

    【讨论】:

      【解决方案2】:

      说UI,现在实现的是最好的,但如果你坚持在所有情况下都让它居中父级,那很简单,只需让布局依赖引用父级即可:

       app:layout_constraintEnd_toStartOf="parent"
       app:layout_constraintStart_toEndOf="parent"
      

      【讨论】:

      • 这并没有解决我的问题。当文本很大时,它会与图标重叠。
      【解决方案3】:

      我有同样的任务。

      如果需要,我需要放置 3 个项目(左、中、右)和椭圆居中的 TextView。

      左右项可以隐藏或具有动态宽度

      示例:

      .

      我为项目选择了带有重力属性的 FrameLayout:

      <FrameLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <ImageView
              android:id="@+id/iv_back"
              style="@style/AppTheme.Clickable"
              android:layout_width="56dp"
              android:layout_height="56dp"
              android:layout_gravity="center_vertical|start"
              android:padding="16dp"
              app:srcCompat="@drawable/ic_back" />
      
          <TextView
              android:id="@+id/tv_title"
              android:layout_width="wrap_content"
              android:layout_height="match_parent"
              android:layout_gravity="center_vertical|center_horizontal"
              android:ellipsize="end"
              android:fontFamily="@font/sf_pro_display_semibold"
              android:gravity="center"
              android:padding="16dp"
              android:singleLine="true"
              android:textColor="@color/black"
              android:textSize="17sp"
              tools:text="Filter team" />
      
          <TextView
              android:id="@+id/tv_action"
              style="@style/AppTheme.Clickable"
              android:layout_width="wrap_content"
              android:layout_height="match_parent"
              android:layout_gravity="center_vertical|end"
              android:fontFamily="@font/sf_pro_display_regular"
              android:padding="16dp"
              android:singleLine="true"
              android:textColor="@color/colorAccent"
              android:textSize="17sp"
              tools:text="Apply" />
      </FrameLayout>
      

      我在更新项目内容后调用 resizeTitle

      private fun getVisibleWidth(view: View): Int {
          return if (view.visibility == View.VISIBLE) {
              view.measuredWidth
          } else {
              0
          }
      }
      
      private fun resizeTitle() {
          binding.root.post {
              val leftWidth = getVisibleWidth(binding.ivBack)
              val rightWidth = getVisibleWidth(binding.tvAction)
              val totalWidth = getVisibleWidth(binding.root)
      
              binding.tvTitle.updateLayoutParams {
                  width = max(totalWidth - max(leftWidth, rightWidth) * 2, 0)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-31
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2012-06-30
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        相关资源
        最近更新 更多