【问题标题】:Single-line TextView cuts text being inside LinearLayout单行 TextView 剪切位于 LinearLayout 内的文本
【发布时间】:2015-03-18 22:34:07
【问题描述】:

我有一个我自己无法解决的问题。 在过去的两天里,我试图找到解决方案,谷歌搜索,在这个网站上阅读答案,玩代码,但失败了......

我正在制作一个覆盖弹出窗口,我的服务将显示在任何打开的应用程序(如 Facebook ChatHead)之上。一切正常,除了一件事:
我刚刚注册,所以我没有足够的声誉来附加图片,这里是the link to the screenshot
最右边的 TextView(用红色箭头显示)被缩小了,我们只看到“R”而不是“RND”。

这里是相对布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <LinearLayout
        android:id="@+id/llIcons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5pt"
        android:gravity="center"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tvIconRDS"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="RDS"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconAS"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="AS"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconTP"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="TP"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconREG"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="REG"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconCDin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="CD in"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconMP3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:text="MP3"
            android:textSize="30sp"/>
        <TextView
            android:id="@+id/tvIconRDM"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:paddingLeft="30dp"
            android:paddingRight="30dp"
            android:text="RDM"
            android:minEms="20"
            android:textSize="30sp"/>
    </LinearLayout>
    <TextView
        android:id="@+id/tvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/llIcons"
        android:layout_centerHorizontal="true"
        android:layout_margin="7dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:gravity="center_horizontal"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textSize="50sp"/>
</RelativeLayout>

下面是扩展此布局并将其添加到 WindowManager 的代码:

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater layoutInflater = LayoutInflater.from(this);
float displayDensity = getResources().getDisplayMetrics().density;
int popupMargin = (int) (20 * displayDensity + 0.5f);
WindowManager.LayoutParams popupParams = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        PixelFormat.TRANSLUCENT);
popupParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
popupParams.y = popupMargin;
rlPopup = (RelativeLayout) layoutInflater.inflate(R.layout.overflow_popup, null);
rlPopup.setBackgroundResource(R.drawable.overflow_popup_shape);
windowManager.addView(rlPopup, popupParams);

我已经尝试了以下方法:

  • 使用android:layout_marginLeft (android:layout_marginRight) 代替android:paddingLeft (android:paddingRight)
  • 为所有 Icons TextViews 设置 minWidthminEms 属性
  • 将所有 Icons TextViews 的 layout_width 属性设置为固定 dp 值而不是 wrap_contents
  • 将 llIcons LinearLayout 的 layout_width 属性设置为固定的 1000dp 值,而不是 wrap_contents
  • 将 LinearLayout 更改为 RelativeLayout(对子元素进行相应更改)

没有任何帮助,我仍然看到“R”而不是“RND”。谁能告诉我我做错了什么?

附:我不能做一个普通的 TextView 而不是 7,因为我需要单独控制它们的样式。

更新一个

我没有足够的声望添加两个以上的链接,所以我把截图放到了zip-file
所以,我做了什么:

  1. 首先我按照@Lamorak 的建议做了,结果得到了以下 XML:

    <LinearLayout
        android:id="@+id/llIcons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5pt"
        android:gravity="center"
        android:orientation="horizontal">
    
        <TextView
            android:id="@+id/tvIconRDS"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="RDS"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconAS"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="AS"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconTP"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="TP"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconREG"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="REG"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconCDin"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="CD in"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconMP3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="MP3"
            android:textSize="30sp"/>
    
        <TextView
            android:id="@+id/tvIconRDM"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:maxLines="1"
            android:text="RDM"
            android:textSize="30sp"/>
    </LinearLayout>
    
    <TextView
        android:id="@+id/tvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/llIcons"
        android:layout_centerHorizontal="true"
        android:layout_margin="7dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:gravity="center_horizontal"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textSize="50sp"/>
    

    我从屏幕截图“option1”中得到了结果。如您所见,元素之间的填充太小,所有 TextView 都缩小为 2 个字母。

  2. 接下来我尝试将所有android:layout_width="0dp" 替换为android:layout_width:"wrap_content"
    结果在“option2”屏幕截图上 - 文本没有被剪切,但元素之间根本没有填充。

  3. 之后,我将android:paddingLeft="30dp" 添加到除第一个 (tvIconRDS) 之外的所有 TextView。我还添加了android:paddingRight="15dp"tvIconRDM TextView。 结果(“option3”屏幕截图)最接近所需的结果,除了“RDS”左侧没有填充。

  4. 但是当我尝试将android:paddingLeft="15dp"android:layout_marginLeft="15dp" 添加到tvIconRDS TextView,甚至android:paddingLeft="15dp"llIcons LinearLayout 时,我得到以下结果:“option4”屏幕截图.

那么,最合适的选项是数字 3,但是如何为第一个图标创建 15dp 的左填充?

更新二

现在可以了!最后我设法使用 TableLayout 做到了:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <TableLayout
        android:id="@+id/tlIcons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:stretchColumns="*">

        <TableRow android:paddingTop="5dp">

            <TextView
                android:id="@+id/tvIconRDS"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/rds_icon"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconAS"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/as_icon"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconTP"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/tp_icon_on"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconREG"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/reg_icon"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconCDin"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/cdin_icon"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconMP3"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/mp3_icon"
                android:textSize="30sp"/>

            <TextView
                android:id="@+id/tvIconRDM"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:layout_marginRight="15dp"
                android:gravity="center_horizontal"
                android:maxLines="1"
                android:text="@string/rdm_icon"
                android:textSize="30sp"/>
        </TableRow>

        <TableRow
            android:paddingBottom="10dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="5dp">

            <TextView
                android:id="@+id/tvEHUText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_span="7"
                android:ellipsize="marquee"
                android:focusable="true"
                android:gravity="center_horizontal"
                android:marqueeRepeatLimit="marquee_forever"
                android:scrollHorizontally="true"
                android:singleLine="true"
                android:textSize="50sp"/>
        </TableRow>
    </TableLayout>

</RelativeLayout>

【问题讨论】:

    标签: android android-layout android-widget


    【解决方案1】:

    也许,是因为你在每个TexView中都使用android:paddingLeft="30dp?您应该改用layout_weight 参数,并将其设置为android:layout_weight="1 到每个TextView。你可以看看这个tutorial,有几个使用权重参数的例子。

    【讨论】:

    • 我不是布局加权的真正朋友,但在这种情况下它可能会有所帮助。设置width="0dp",删除paddingsminEms 并添加weight。这将在TextViews 之间平均分配LinearLayout 的宽度。
    • 感谢@VadymVL 和您的建议!我已经编辑了我的问题(请参阅“更新一个”标题后的文字),您能看一下吗?
    • 我试过这样做,但主要问题是字体过大。因此,textViews 彼此重叠。如果您可以使用较小的字体大小,则所有元素都将适合屏幕。如果不是,在我看来,3 号是最好的结果。
    • 但是为什么layout_width="wrap_content" 不工作呢?我认为它应该包装内容,而不管它的大小......
    • 我也是这么想的。但是 mybe 的其他参数(例如 weight 和 padding)会覆盖它的功能。
    【解决方案2】:

    我终于设法使用 TableLayout 做到了。请参阅我的问题文本中的“更新两个”。 Here is the result.

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2022-08-05
      • 2013-07-07
      • 1970-01-01
      相关资源
      最近更新 更多