【发布时间】: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 设置
minWidth、minEms属性 - 将所有 Icons TextViews 的
layout_width属性设置为固定 dp 值而不是wrap_contents - 将 llIcons LinearLayout 的
layout_width属性设置为固定的 1000dp 值,而不是wrap_contents - 将 LinearLayout 更改为 RelativeLayout(对子元素进行相应更改)
没有任何帮助,我仍然看到“R”而不是“RND”。谁能告诉我我做错了什么?
附:我不能做一个普通的 TextView 而不是 7,因为我需要单独控制它们的样式。
更新一个
我没有足够的声望添加两个以上的链接,所以我把截图放到了zip-file。
所以,我做了什么:
-
首先我按照@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 个字母。
接下来我尝试将所有
android:layout_width="0dp"替换为android:layout_width:"wrap_content"。
结果在“option2”屏幕截图上 - 文本没有被剪切,但元素之间根本没有填充。之后,我将
android:paddingLeft="30dp"添加到除第一个 (tvIconRDS) 之外的所有 TextView。我还添加了android:paddingRight="15dp"到tvIconRDMTextView。 结果(“option3”屏幕截图)最接近所需的结果,除了“RDS”左侧没有填充。但是当我尝试将
android:paddingLeft="15dp"或android:layout_marginLeft="15dp"添加到tvIconRDSTextView,甚至android:paddingLeft="15dp"到llIconsLinearLayout 时,我得到以下结果:“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