RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1159286
Accepted
Sergei Buvaka
Sergei Buvaka
Asked:2020-07-31 02:13:25 +0000 UTC2020-07-31 02:13:25 +0000 UTC 2020-07-31 02:13:25 +0000 UTC

XML 标记中的元素排列

  • 772

有这样的布局:

在此处输入图像描述

有3个TextView:

  • “我的分数”
  • “*1801”
  • “已安装”

我需要“*1801”和“已安装”始终以全尺寸显示,但如果我们有一个较长的“我的帐户”并且它不适合屏幕,那么它就会被应用elipsize。同时,非常重要的是“我的账户”和“*1801”要紧挨着,就好像它是一个一样TextView。

问题是我无法弄清楚如何正确设置元素的标记。如果有人可以提供建议,我将不胜感激。

android
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Sergei Buvaka
    2020-07-31T17:42:01Z2020-07-31T17:42:01Z

    我不得不写这个视图:

     class SeparateRestrictTextView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : ViewGroup(context, attrs, defStyleAttr) {
    
        private var inited: Boolean = false
        private var showSeparatedRestrictionMode: Boolean = false
    
        @get:Px
        private val fadeOffset: Int by lazyUnsafe { context.dpToPx(FADE_OFFSET) }
    
        init {
            inflate(context, R.layout.view_separate_restrict_text, this)
            context.obtainStyledAttributes(attrs, R.styleable.SeparateRestrictTextView).apply {
                if (hasValue(R.styleable.SeparateRestrictTextView_srtv_textAppearance)) {
                    fadedText.setTextAppearance(getResourceId(R.styleable.SeparateRestrictTextView_srtv_textAppearance, View.NO_ID))
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        restrictionText.setTextAppearance(getResourceId(R.styleable.SeparateRestrictTextView_srtv_textAppearance, View.NO_ID))
                    } else {
                        restrictionText.setTextAppearance(context, getResourceId(R.styleable.SeparateRestrictTextView_srtv_textAppearance, View.NO_ID))
                    }
                }
                recycle()
            }
            inited = true
        }
    
        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            measureChildWithPadding(restrictionText, widthMeasureSpec, heightMeasureSpec)
            measureChildWithPadding(fadedText, widthMeasureSpec, heightMeasureSpec)
    
            val desiredWidth = if (fadedText.inEllipsizedMode) {
                showSeparatedRestrictionMode = true
                measureChildWithPadding(fadedText, widthMeasureSpec, heightMeasureSpec, fadeOffset + restrictionText.measuredWidth)
                fadedText.measuredWidth + fadeOffset + restrictionText.measuredWidth
            } else {
                showSeparatedRestrictionMode = false
                fadedText.measuredWidth
            }
    
            val desiredHeight = max(fadedText.measuredHeight, restrictionText.measuredHeight)
    
            setMeasuredDimension(
                measureDimension(desiredWidth, widthMeasureSpec),
                measureDimension(desiredHeight, heightMeasureSpec)
            )
        }
    
        override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
            if (showSeparatedRestrictionMode) {
                val restrictionTop = (bottom - top - restrictionText.measuredHeight) / 2
                restrictionText.layout(
                    right - left - restrictionText.measuredWidth,
                    restrictionTop,
                    right - left,
                    restrictionTop + restrictionText.measuredHeight
                )
            } else {
                restrictionText.layout(0, 0, 0, 0)
            }
    
            val fadedTextTop = (bottom - top - fadedText.measuredHeight) / 2
            val fadedTextRightRight = if (showSeparatedRestrictionMode) {
                right - left - restrictionText.measuredWidth - fadeOffset
            } else {
                right - left
            }
            fadedText.layout(
                0,
                fadedTextTop,
                fadedTextRightRight,
                fadedTextTop + fadedText.measuredHeight
            )
        }
    
        fun setContent(faded: String?, restriction: String?, separator: String) {
            if (faded.isNullOrEmpty() && restriction.isNullOrEmpty()) {
                isGone = true
                return
            }
            isVisible = true
            fadedText.text = listOfNotNull(faded?.takeIf { it.isNotEmpty() }, restriction).joinToString(separator)
            restrictionText.text = restriction
        }
    
        override fun addView(child: View?) {
            if (!inited) {
                super.addView(child)
            }
        }
    
        private fun measureDimension(desiredSize: Int, measureSpec: Int): Int {
            val specMode = MeasureSpec.getMode(measureSpec)
            val specSize = MeasureSpec.getSize(measureSpec)
    
            return when (specMode) {
                MeasureSpec.UNSPECIFIED -> desiredSize
                MeasureSpec.AT_MOST -> min(desiredSize, specSize)
                else -> specSize
            }
        }
    
        private fun measureChildWithPadding(child: View, parentWidthMeasureSpec: Int, parentHeightMeasureSpec: Int, rightPadding: Int = 0) {
            val lp = child.layoutParams
    
            val childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, rightPadding, lp.width)
            val childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, 0, lp.height)
    
            child.measure(childWidthMeasureSpec, childHeightMeasureSpec)
        }
    
        private companion object {
            @Dp
            const val FADE_OFFSET = 6f
        }
    }
    

    XML 标记:

    <?xml version="1.0" encoding="utf-8"?>
    <merge 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="wrap_content">
    
        <TextView
            android:id="@+id/fadedText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical" />
    
        <TextView
            android:id="@+id/restrictionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:includeFontPadding="false"
            android:maxLines="1"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </merge>
    

    这是在 attrs 中:

    <declare-styleable name="SeparateRestrictTextView">
        <attr name="srtv_textAppearance" format="reference" />
    </declare-styleable>
    
    • 1
  2. Best Answer
    Alexander Chernin
    2020-07-31T19:47:48Z2020-07-31T19:47:48Z

    如果是这样(没有间距、填充和合并):

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="VISA"
            android:textAlignment="center" />
    
        <TextView
            android:layout_width="0sp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="Мой счет" />
    
        <EditText
            android:layout_width="0sp"
            android:layout_height="match_parent"
            android:layout_weight="5"
            android:text="*1801"
        />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Установлен">
            Установлен
        </Button>
    
    </LinearLayout>
    
    • 0

相关问题

  • 来自片段的列表落后于 BottomNavigationView

  • 无法将变量从 Activity 传递到 Fragment

  • 构建与完成的片段略有不同的片段的最佳方法是什么?

  • 如何更改来自服务器的响应中的日期格式?

  • 谷歌地图在应用程序的发布版本中不起作用

  • 材料设计按钮。单击按钮上的可选区域!

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5