我正在使用Android上的应用程序而我在设计许多密度的布局时遇到了问题。 我已经阅读了android's documentation about supporting screens和很多博客,而且我对这个主题仍感到非常困惑。 在我的应用程序中,我根据文档创建了android资源目录。我的意思是,我有以下布局文件夹:
问题在于,当我使用mylayout.xml进行普通屏幕时,这种布局对所有密度都没有好处。例如,布局由具有普通屏幕的两个设备使用,但其中一个具有xxhdpi密度640dpX360dp(三星s4),另一个设备具有mdpi密度480dpX320dp(Sony Xperia ST21a)。当我看到结果非常惊人时彼此之间的差异如果我努力适应其中一个,另一个(当然)改变并且是坏的。
这是普通屏幕的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:src="@drawable/androidladscape"
android:visibility="visible"
android:scaleType="fitXY" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:layout_marginTop="27dp"
android:src="@drawable/btnclose"
android:background="@null"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button"
android:visibility="invisible" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_marginBottom="37dp"
android:background="@drawable/downloadsmall"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp"
android:text="@string/button_download"
android:textColor="#ffffff"
android:textSize="29dp"
android:visibility="invisible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/title_2"
android:id="@+id/textView3"
android:layout_below="@+id/imageButton"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_marginTop="20dp"
android:textSize="30dp"
android:textColor="#fafdff"
android:singleLine="false"
android:lineSpacingExtra="0.15sp"
android:fontFamily="oswaldbold.ttf"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/description_2"
android:id="@+id/textView4"
android:layout_below="@+id/textView3"
android:layout_alignLeft="@+id/textView3"
android:layout_alignStart="@+id/textView3"
android:textColor="#ffffff"
android:textSize="18sp"
android:layout_marginTop="10dp"
android:lineSpacingExtra="2sp"
android:ellipsize="end"
android:fontFamily="3"
android:lines="3"
android:maxLines="3" />
</RelativeLayout>
结果是:
正如你所看到的,我使用dp和sp作为android推荐,但我真的不明白。如果我在第二段下面添加一个按钮,问题会开始变得更大。在三星S4我可以看到它,但在Xperia直接不会出现。
我如何处理这种情况?
谢谢你。 P.S。:我在这里读了很多问题,但我找不到可以帮助我的答案。
[UPDATE]
下图显示了我在设计中对布局法线的要求:
但是,当我在Moto G设备(xhdpi密度为592dpX360dp的普通屏幕)上测试时,我可以看到以下内容:
并且S4显示以下内容:
如果我设置一个,则另一个中断。
这是布局更新,我使用默认的android字体
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:src="@drawable/bgtestlandscape"
android:visibility="visible"
android:scaleType="fitXY" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:layout_marginTop="27dp"
android:src="@drawable/testclose"
android:background="@null"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button"
android:visibility="visible" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_marginBottom="37dp"
android:background="@drawable/testdownload"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp"
android:text="@string/download"
android:textColor="#ffffff"
android:textSize="29dp"
android:visibility="visible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/title_2"
android:id="@+id/textView3"
android:textSize="25sp"
android:textColor="#000000"
android:singleLine="false"
android:lineSpacingExtra="0.15sp"
android:fontFamily="oswaldbold.ttf"
android:layout_marginTop="45dp"
android:layout_below="@+id/imageButton"
android:layout_toLeftOf="@+id/imageButton"
android:layout_toStartOf="@+id/imageButton" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/description_2"
android:id="@+id/textView4"
android:layout_below="@+id/textView3"
android:layout_alignLeft="@+id/textView3"
android:layout_alignStart="@+id/textView3"
android:textColor="#000000"
android:textSize="15sp"
android:layout_marginTop="10dp"
android:lineSpacingExtra="2sp"
android:ellipsize="end"
android:fontFamily="3"
android:lines="3"
android:maxLines="3" />
</RelativeLayout>
答案 0 :(得分:2)
<强>更新强>
正如我在您的布局中看到的那样 - 您希望文本与底部按钮对齐,右侧与顶部(“交叉”)按钮对齐。
您应该在任何地方使用sp
单位来处理文字。您的Button
使用dp
个单位,因为您在不同屏幕上的TextView
和Button
宽度之间的比例不同。
删除TextView对齐以启动ImageButton
并将两个TextView对齐到Button的开头和结尾:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:src="@drawable/bgtestlandscape"
android:visibility="visible"
android:scaleType="fitXY" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:layout_marginTop="27dp"
android:src="@drawable/testclose"
android:background="@null"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button"
android:visibility="visible" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_marginBottom="37dp"
android:background="@drawable/testdownload"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="30dp"
android:layout_marginEnd="30dp"
android:text="@string/download"
android:textColor="#ffffff"
android:textSize="29sp"
android:visibility="visible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/title_2"
android:id="@+id/textView3"
android:textSize="25sp"
android:textColor="#000000"
android:singleLine="false"
android:lineSpacingExtra="0.15sp"
android:fontFamily="oswaldbold.ttf"
android:layout_marginTop="45dp"
android:layout_below="@+id/imageButton"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/description_2"
android:id="@+id/textView4"
android:layout_below="@+id/textView3"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button"
android:textColor="#000000"
android:textSize="15sp"
android:layout_marginTop="10dp"
android:lineSpacingExtra="2sp"
android:ellipsize="end"
android:fontFamily="3"
android:lines="3"
android:maxLines="3" />
</RelativeLayout>
OLD ANSWER
索尼Xperia ST21a似乎安装了Android 4.0。自Android 4.1起,您可以使用android:fontFamily
属性来设置自定义字体。因此,在Sony Xperia上,您的文本将使用默认的Android字体呈现。
在Android 4.0及更早版本中设置自定义字体:
TextView text = (TextView) findViewById(R.id.textView3);
Typeface font = Typeface.createFromAsset(getAssets(), "oswaldbold.ttf");
text.setTypeface(font);