Android 使用硬编码值的应用布局看起来很糟糕

Android app layout looks bad with hardcoded values

在此处试用新的应用程序布局。 这是我想要的样子(在 android 工作室中看起来像这样):

我想让文本在任何设备上看起来都很好。现在我正在使用硬编码值,但不知道该怎么做。任何资源/代码示例都会很棒。

这是我当前的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:id="@+id/awesomelayout">

<ImageView
    android:id="@+id/iconimg"
    android:src="@drawable/ic_launcher"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />


<TextView android:text="Phone Optimizer" android:layout_width="wrap_content" android:layout_centerHorizontal="true"
    android:layout_height="wrap_content"
    android:id="@+id/title"
    android:layout_alignParentTop="true"
    android:textSize="25dp" />





<ImageView
    android:id="@+id/safe"
    android:src="@drawable/sec"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:layout_below="@+id/lazyswipe"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="42dp" />
/>


<Button
    android:layout_width="100dp"
    android:layout_height="50dp"

    android:text="Scan Now"
    android:id="@+id/SecButton"
    android:onClick="secBtn"

    android:layout_gravity="right"
    android:layout_alignBottom="@+id/safe"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<TextView android:text="360 Security" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/smltitle"
    android:textSize="30dp"


    android:layout_alignTop="@+id/safe"
    android:layout_toRightOf="@+id/safe"
    android:layout_toEndOf="@+id/safe" />

<TextView
    android:text="Scan for Viruses" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/smldsc"
    android:textSize="23dp"


    android:layout_below="@+id/smltitle"
    android:layout_alignLeft="@+id/smllazydsc"
    android:layout_alignStart="@+id/smllazydsc" />









<ImageView
    android:id="@+id/lazyswipe"
    android:src="@drawable/lz"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />
/>


<Button
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="Update Now"
    android:id="@+id/lazyBtn"
    android:onClick="lazyBtn"
    android:layout_gravity="right"
    android:layout_alignBottom="@+id/lazyswipe"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<TextView android:text="LazySwipe" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/smllazytitle"
    android:textSize="30dp"
    android:layout_alignTop="@+id/lazyswipe"
    android:layout_alignRight="@+id/smltitle"
    android:layout_alignEnd="@+id/smltitle" />

<TextView
    android:text="Make phone 30% faster" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/smllazydsc"
    android:textSize="23dp"

    android:layout_below="@+id/smllazytitle"
    android:layout_alignLeft="@+id/smllazytitle"
    android:layout_alignStart="@+id/smllazytitle" />


<ImageView
    android:id="@+id/apus"
    android:src="@drawable/apus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:layout_below="@+id/iconimg"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />
/>


<Button
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="Speed Now"
    android:id="@+id/apusButton"
    android:onClick="apusBtn"
    android:layout_gravity="right"
    android:layout_alignBottom="@+id/apus"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<TextView android:text="Apus Booster" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/apusTitle"
    android:textSize="30dp"
    android:layout_alignTop="@+id/apus"
    android:layout_alignLeft="@+id/apusdesc"
    android:layout_alignStart="@+id/apusdesc" />

<TextView
    android:text="Make phone 30% faster" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/apusdesc"
    android:textSize="23dp"

    android:layout_below="@+id/apusTitle"
    android:layout_alignLeft="@+id/smllazytitle"
    android:layout_alignStart="@+id/smllazytitle" />

请给我任何建议,我会解决它:)

好的做法是将您的硬代码值移动到 values->strings.xml 并像这样从那里获取字符串 -> android:text="@string/yourStringVariableName"

在值中为不同的屏幕尺寸提供不同的尺寸 > dimens.xml

然后设置维度而不是硬编码,例如: 设置 android:layout_width="@dimens/btn_size" 而不是 android:layout_width="100dp"

您可以对文本大小等执行此操作。

您还可以使用嵌套布局或 wrap_contentmatch_parent 让您的布局在所有设备上看起来都不错。

首先我看不到任何图像。上传了吗?

你问的是一个很难回答的问题,你必须做很多步骤和测试才能成功 正如另一个答案中提到的,您可以将 dimens.xml 用于不同的设备。 还要确保对于您的文本大小,您使用 sp 而不是 dp。它考虑了设备上的用户偏好和主题。 这些都很好,但我不会从那里开始。

摆脱所有硬编码值,使用 wrap_content 和 match_parent 设置视图大小,并将文本大小替换为如下样式(小、中、大)

<TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/TextAppearance.DeviceDefault.Medium"
            android:text="@string/yourTextIdInStringsXml"
            android:layout_marginTop="5dip"
            android:layout_marginBottom="2dip"/>

如您所见,我只对小边距使用硬编码值,这可能不会引起任何问题。 您还有一个硬编码大小的按钮。使用 wrap_content 或 match_parent,如果您需要将它与需要更大或更小的其他东西配对,请使用嵌套的 LinearLayouts 和 layout_weight 属性。

祝你好运!!!

Ok, so I fixed it myself, I'm sure I'm still using bad coding practices, but the layout looks good on the emulator and my own device. yay.!

Here's the code:

    <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:auto="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:id="@+id/awesomelayout">

    <ImageView
        android:id="@+id/iconimg"
        android:src="@drawable/ic_launcher"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />


    <TextView android:text="Phone Optimizer" android:layout_width="wrap_content" android:layout_centerHorizontal="true"
        android:layout_height="wrap_content"
        android:id="@+id/title"
        android:layout_alignParentTop="true"
        android:textSize="25dp" />







    <ImageView
        android:id="@+id/apus"
        android:src="@drawable/apus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_below="@+id/iconimg"
        android:layout_marginTop="30dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />





    <TextView android:text="Apus Booster" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/apusTitle"
        android:textSize="30dp"
        android:layout_alignTop="@+id/apus"
        android:layout_alignLeft="@+id/apusdesc"
        android:layout_alignStart="@+id/apusdesc" />

    <TextView
        android:text="Make phone 30% faster" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/apusdesc"
        android:textSize="23dp"

        android:layout_below="@+id/apusTitle"
        android:layout_alignLeft="@+id/smllazytitle"
        android:layout_alignStart="@+id/smllazytitle" />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speed Now"
        android:id="@+id/apusButton"
        android:onClick="apusBtn"
        android:layout_gravity="right"
        android:layout_below="@+id/apusdesc"
        android:layout_alignParentRight="true"
         />







    <ImageView
        android:id="@+id/lazyswipe"
        android:src="@drawable/lz"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"
        android:layout_below="@+id/apus" />



    <TextView android:text="LazySwipe" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/smllazytitle"
        android:textSize="30dp"
        android:layout_alignTop="@+id/lazyswipe"
        android:layout_alignRight="@+id/smltitle"
        android:layout_alignEnd="@+id/smltitle" />

    <TextView
        android:text="Make phone 30% faster" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/smllazydsc"
        android:textSize="23dp"

        android:layout_below="@+id/smllazytitle"
        android:layout_alignLeft="@+id/smllazytitle"
        android:layout_alignStart="@+id/smllazytitle" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Update Now"
        android:id="@+id/lazyBtn"
        android:onClick="lazyBtn"
        android:layout_gravity="right"
        android:layout_below="@+id/smllazydsc"
        android:layout_alignParentRight="true"
         />




    <ImageView
        android:id="@+id/safe"
        android:src="@drawable/sec"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_below="@+id/lazyswipe"
        android:layout_marginTop="80dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
         />

    <TextView android:text="360 Security" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/smltitle"
        android:textSize="30dp"
        android:layout_alignTop="@+id/safe"
        android:layout_toRightOf="@+id/safe"
        android:layout_toEndOf="@+id/safe" />

    <TextView
        android:text="Scan for Viruses" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/secdesc"
        android:layout_below="@+id/smltitle"
        android:layout_alignLeft="@+id/smllazydsc"
        android:layout_alignStart="@+id/smllazydsc" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Scan Now"
        android:id="@+id/SecButton"
        android:onClick="secBtn"
        android:layout_below="@+id/secdesc"
        android:layout_gravity="right"
        android:layout_alignParentRight="true"
         />




</RelativeLayout>
</ScrollView>