Android 学习笔记五:支持不同的设备

这里所说的不同设备包括两种不同:操作系统语言,以及屏幕大小和像素密度。

国际化

适应不同的操作系统语言,即平时说的 i18n(internationalization),即国际化。我们这里只讨论最简单的一种情况,就是对不同的系统显示对应语言的文案,其实还有更多的包括对其方式、操作习惯等就不考虑了。

前面讲到过,不要在代码中写死文案,所有文案相关的字符串都应该写在 strings.xml 中。这样做国际化就简单很多,只需要再新建一个 values-xxx 文件,并在里面放上一个 strings.xml 文件即可。当安卓应用启动的时候会自动选择对应的语言,如果没有则会自动降级到 values 。比如 如果定义了一个 values-zh/strings.xml,那么当操作系统为中文的时候就会自动加载这个文件中的值。而且 strings.xml 里面的写法完全一样。

现在创建一个 values-zh/strings.xml 文件,并且在里面写上如下代码:

<resources>
    <string name="app_name">测试应用</string>

    <string name="action_settings">设置</string>
    <string name="title">标题</string>
    <string name="button_login">登录</string>
    <string name="username_hint">输入账号</string>
    <string name="username_label">账号</string>
    <string name="password_hint">输入密码</string>
    <string name="password_label">密码</string>
    <string name="title_activity_profile">首页</string>

    <string name="hello_world">你好!</string>
    <string name="action_search">搜索</string>
</resources>

然后把 values/strings.xml 里面的字符串都改成英文:

<resources>
    <string name="app_name">HelloWorld</string>

    <string name="action_settings">Settings</string>
    <string name="title">title</string>
    <string name="button_login">login</string>
    <string name="username_hint">username</string>
    <string name="username_label">username</string>
    <string name="password_hint">password</string>
    <string name="password_label">password</string>
    <string name="title_activity_profile">ProfileActivity</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_search">search</string>
</resources>

然后运行,在模拟器中设置不同的语言试试。

适应不同的屏幕大小和像素密度

屏幕大小是指屏幕的高度和宽度,而像素密度指的是多少个物理像素来显示一个逻辑像素。和上面的国际化几乎一样的,都是通过增加不同的资源文件来实现适应不同的屏幕。
如果你的应用支持横屏的话,横屏其实是被当做了另一种屏幕尺寸的。

下面我们来修改一下 MainActivity ,做一个简单的改动,让他在大屏幕上是水平排列的,而在小屏幕上是垂直排列的。
res 下面新建一个 layout-large/activity_main.xml 文件,把原来的 activity_main.xml 复制到这里来,需要对 layout-large/activity_main.xml 进行一些修改:

  • android:orientation=“vertical” 改成 android:orientation=”horizontal”
  • 把里面的几个组件全部改成 android:layout_width=“wrap_content”,不然宽度太宽之后会把后面的寄到屏幕外

修改之后的代码如下:

<LinearLayout 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:orientation="horizontal">

    <TextView android:text="@string/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <EditText
        android:id="@+id/username"
        style="@style/EditTextStyle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:drawableLeft="@drawable/ic_phone"
        android:drawableStart="@drawable/ic_phone"
        android:hint="@string/username_hint"
        android:imeActionId="@+id/username"
        android:imeOptions="actionUnspecified"
        android:inputType="text"/>

    <EditText
        android:id="@+id/password"
        style="@style/EditTextStyle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:drawableLeft="@drawable/ic_lock"
        android:drawableStart="@drawable/ic_lock"
        android:hint="@string/password_hint"
        android:imeActionId="@+id/password"
        android:imeOptions="actionUnspecified"
        android:inputType="textPassword"/>

    <Button
        android:id="@+id/button_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_login"
        />

</LinearLayout>

然后运行,在不同的模拟器上会看到有不同的布局。

对不同像素密度的设备也是同样的方式,只需要创建 drawable-h/ 之类的文件夹,并且在里面放上对应的图片就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值