这里所说的不同设备包括两种不同:操作系统语言,以及屏幕大小和像素密度。
国际化
适应不同的操作系统语言,即平时说的 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/
之类的文件夹,并且在里面放上对应的图片就行了。