9

更新#1

我观察到<item name="android:textSize">14sp</item>/res/values/styles.xml 中设置为 20sp 会导致输入元素在小于 5" 的设备上正常显示。看来减小文本大小并没有减小输入框的大小。这是应该的吗正常吗?

TLDR 版本

你好呀,

我在我的 Android 项目中遇到了输入元素大小的问题。输入元素在尺寸 < 5" 的设备上显得更大,但在我的较大设备上显得正常。

下面的屏幕截图说明了这一点。知道可能是什么原因吗?

详细版

你好呀,

我目前在跨不同模拟器的 Android 项目中面临一个奇怪的问题,即我的表单元素的大小。由于这是我第一次创建移动应用程序,如果这是“功能”而不是错误,请随时启发我。

Nexus 7布局预览中,表单元素按预期显示:

在此处输入图像描述

但是,在 Galaxy Nexus 布局预览中,表单元素看起来比预期的要大,这是不可取的:

在此处输入图像描述

我尝试了很多方法,但都无法解决这个问题。此问题发生在屏幕尺寸小于 5" 的所有设备上。

这是我的布局 XML 文件:

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/register_link"
        style="@style/FormFont.Label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="3dp"
        android:clickable="true"
        android:onClick="onClickRegisterLink"
        android:text="@string/register_link_text" />

    <RelativeLayout
        android:id="@+id/layout_layout_form"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_above="@+id/register_link"
        android:gravity="center" >

        <ImageView
            android:id="@+id/logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/layout_form"
            android:layout_alignRight="@+id/layout_form"
            android:layout_marginBottom="50dp"
            android:contentDescription="@string/logo_description"
            android:src="@drawable/logo" />

        <RelativeLayout
            android:id="@+id/layout_form"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/logo"
            android:gravity="center" >

            <TextView
                android:id="@+id/label_username"
                style="@style/FormFont.Label"
                android:layout_alignBottom="@+id/input_username"
                android:layout_alignLeft="@+id/label_password"
                android:layout_alignRight="@+id/label_password"
                android:layout_alignTop="@+id/input_username"
                android:layout_toLeftOf="@+id/input_username"
                android:gravity="right"
                android:text="@string/label_username" />

            <TextView
                android:id="@+id/label_password"
                style="@style/FormFont.Label"
                android:layout_alignBottom="@+id/input_password"
                android:layout_alignTop="@+id/input_password"
                android:layout_below="@+id/label_username"
                android:layout_marginRight="50dp"
                android:layout_toLeftOf="@+id/input_password"
                android:gravity="right"
                android:text="@string/label_passphrase" />

            <EditText
                android:id="@+id/input_username"
                style="@style/FormFont.Input"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:inputType="text" />

            <EditText
                android:id="@+id/input_password"
                style="@style/FormFont.Input"
                android:layout_alignLeft="@+id/input_username"
                android:layout_alignRight="@+id/input_username"
                android:layout_below="@+id/input_username"
                android:layout_marginTop="30dp"
                android:inputType="textPassword" />

            <Button
                android:id="@+id/button_login"
                style="@style/FormFont.Label"
                android:layout_alignLeft="@+id/input_password"
                android:layout_alignRight="@+id/input_password"
                android:layout_below="@+id/input_password"
                android:layout_marginTop="35dp"
                android:gravity="center"
                android:text="@string/button_login" />
        </RelativeLayout>

    </RelativeLayout>

</RelativeLayout>

我的 /res/values/styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

    <style name="FormFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">center_vertical</item>
        <item name="android:textSize">14sp</item>
    </style>

    <style name="FormFont.Label">
    </style>

    <style name="FormFont.Input">
        <item name="android:ems">12</item>
    </style>

</resources>

我的 /res/values-large/styles.xml:

<resources>

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>
    
    <style name="FormFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">center_vertical</item>
        <item name="android:textSize">20sp</item>
    </style>

    <style name="FormFont.Label">
    </style>

    <style name="FormFont.Input">
        <item name="android:ems">12</item>
    </style>

</resources>

如果您以前遇到过这种情况并知道可能是什么原因,请告诉我:) 非常感谢!

4

3 回答 3

1

我通过为, , ,android:layout_height中的属性指定不同的值解决了这个问题。/res/values-xlarge/styles.xml/res/values-large/styles.xml/res/values/styles.xml/res/values-small/styles.xml

这使我能够控制不同尺寸的 Android 设备中每个输入字段的确切高度。

于 2013-05-23T05:22:51.923 回答
0

看来 Galaxy Nexus 的屏幕密度是xhdpi

连接虚拟设备

您可能想要为res/values-xhdpi/Galaxy Nexus-screen-family 中的设备添加和添加值。您也可以使用sw<N>dp(对于 Galaxy Nexus,res/values-sw320dp/实际屏幕尺寸是360dp X 567dp,也就是说,虽然values-sw320dp包括 Galaxy Nexus,但它也包括任何其他最小宽度/高度为 320dp 的设备),w<N>dp和/或h<N>dp. 请参阅提供替代资源中的表格。

于 2013-05-21T05:18:27.370 回答
0

但是,在 Galaxy Nexus 布局预览中,表单元素看起来比预期的要大,这是不可取的

实际上,它并没有更大。两个设备上的EditText物理尺寸完全相同。这就是与密度无关的像素 (dp) 的工作方式。他们将根据密度基线对所有内容进行缩放,以便所有内容在多个设备上都具有相同的大小。如果您有两个屏幕尺寸相同但密度不同的设备,这将特别有用。因此,两个设备上的 UI 元素的物理尺寸保持不变。如果您使用像素 (px),它会非常不同(具有较高密度的设备的物理尺寸将小于低密度设备上的物理尺寸)。

看起来更大,因为 1. UI 编辑器中 Galaxy Nexus 和 Nexus 7 的 UI 都缩放到(几乎)相同的外形尺寸 2. 您为两者设置了不同的文本大小。这实际上是这样的:

在此处输入图像描述

两台设备上的EditTexts(屏幕截图实际上来自我的 Nexus 4,它的密度仅比 GN 略高,所以这应该不是什么大问题,我的 Nexus 7)具有相同的高度,但 N4 有一个较小的文本(这是因为您将其指定为这种方式)。

于 2013-05-27T00:34:30.123 回答