为Android中的许多密度设计布局 - 正常

时间:2015-09-28 12:55:09

标签: android android-layout

我正在使用Android上的应用程序而我在设计许多密度的布局时遇到了问题。 我已经阅读了android's documentation about supporting screens和很多博客,而且我对这个主题仍感到非常困惑。 在我的应用程序中,我根据文档创建了android资源目录。我的意思是,我有以下布局文件夹:

  • 布局正常/ mylayout.xml
  • 布局小/ mylayout.xml
  • 布局大/ mylayout.xml
  • 布局XLARGE / mylayout.xml

问题在于,当我使用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>

结果是:

  • for xxhdpi
  • 中的640x360dp

enter image description here

  • 适用于mdpi中的480x320dp

enter image description here

正如你所看到的,我使用dp和sp作为android推荐,但我真的不明白。如果我在第二段下面添加一个按钮,问题会开始变得更大。在三星S4我可以看到它,但在Xperia直接不会出现。

我如何处理这种情况?

谢谢你。 P.S。:我在这里读了很多问题,但我找不到可以帮助我的答案。

[UPDATE]

下图显示了我在设计中对布局法线的要求:

enter image description here

但是,当我在Moto G设备(xhdpi密度为592dpX360dp的普通屏幕)上测试时,我可以看到以下内容:

enter image description here

并且S4显示以下内容:

enter image description here

如果我设置一个,则另一个中断。

这是布局更新,我使用默认的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>

1 个答案:

答案 0 :(得分:2)

<强>更新

正如我在您的布局中看到的那样 - 您希望文本与底部按钮对齐,右侧与顶部(“交叉”)按钮对齐。

您应该在任何地方使用sp单位来处理文字。您的Button使用dp个单位,因为您在不同屏幕上的TextViewButton宽度之间的比例不同。

删除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);