单行TextView会剪切LinearLayout中的文本

时间:2015-03-18 22:34:07

标签: android android-layout android-widget

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

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

这是RelativeLayout:

<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_marginLeftandroid:layout_marginRight)代替android:paddingLeftandroid:paddingRight
  • 为所有图标TextView设置minWidthminEms属性
  • 将所有图标TextView的layout_width属性设置为固定的dp值而不是wrap_contents
  • 将llIcons LinearLayout的layout_width属性设置为固定的1000dp值,而不是wrap_contents
  • 将LinearLayout更改为RelativeLayout(对子元素进行相应更改)

没有任何帮助,我仍然看到&#34; R&#34;而不是&#34; RND&#34;。有人能告诉我我做错了什么吗?

P.S。我不能做一个常见的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"/>
    

    我从截图&#34; option1&#34;得到了结果。如您所见,元素之间的填充太小,所有TextView都缩小为2个字母。

  2. 接下来,我尝试将所有android:layout_width="0dp"替换为android:layout_width:"wrap_content"
    结果是&#34; option2&#34;截图 - 文本未被剪切,但元素之间根本没有填充。

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

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

  5. 所以,最合适的选项是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>
    

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我终于设法使用TableLayout来完成它。请参阅&#34;更新二&#34;在我的问题文本中。 Here is the result