《安卓开发官方文档》学习笔记二actionBar与适配问题
文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍
1.action bar
通过在项目的 res/menu
目录中新增一个XML 文件来为action bar 添加操作。
为想要添加到action bar 中的每个条目添加一个 <item>
元素。例如:
res/menu
/main_activity_actions.xml
要为activity 添加action bar,只需简单地设置属性为 11
或者更大。例如:
<manifest ... >
<uses-sdk android:minSdkVersion="11" ... />
...
</manifest>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 搜索, 应该作为动作按钮展示-->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="ifRoom" />
<!-- 设置, 在溢出菜单中展示 --><item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>
要为action bar 布局菜单条目,就要在activity 中实现 onCreateOptionsMenu() 回调方法来 inflate
菜单资源从而获取 Menu 对象
onCreateOptionsMenu() 为创建Menu菜单的项目
实现向上导航需要在manifest 文件中声明父activity ,同时在action bar 中设置向上按钮可用。
- Theme.Holo,一个“dark” 的主题
- Theme.Holo.Light,一个“light” 的主题
- Theme.Holo.Light.DarkActionBar 来达到如下效果:action bar 为dark,其他部分为light。
当使用Support 库时,必须使用 Theme.AppCompat 主题替代:
- Theme.AppCompat,一个“dark”的主题
- Theme.AppCompat.Light,一个“light”的主题
- Theme.AppCompat.Light.DarkActionBar,一个带有“dark” action bar 的“light”主题
为下级Activity 添加向上按钮
实现向上导航需要在manifest文件中声明父activity,同时在action bar 中设置向上按钮可用。
如何在manifest 中声明一个activity 的父类,例如:
<!-- 主 main/home 活动 (没有上级活动) --> <activity android:name="com.example.myfirstapp.MainActivity" ...>
</activity>
<!-- 主活动的一个子活动--><activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- meta-data 用于支持 support 4.0 以及以下来指明上级活动 -->
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
然后,通过调用setDisplayHomeAsUpEnabled() 来把app icon 设置成可用的向上按钮:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);setContentView(R.layout.activity_displaymessage);
getSupportActionBar().setDisplayHomeAsUpEnabled(
true);
// 如果你的minSdkVersion属性是11活更高, 应该这么用:// getActionBar().setDisplayHomeAsUpEnabled(true);
}
由于系统已经知道 MainActivity
是 DisplayMessageActivity
的父activity,当用户按下向上按钮时,系统会导航到恰当的父activity - 你不需要去处理向上按钮的事件。
启用叠加模式(Overlay Mode)
要为action bar 启用叠加模式,需要自定义一个主题,该主题继承于已经存在的action bar 主题,并设置 android:windowActionBarOverlay
属性的值为 true
。
如果 minSdkVersion 为 11
或更高,自定义主题必须继承 Theme.Holo 主题(或者其子主题)
<resources>
<!-- 为程序或者活动应用的主题样式 -->
<style name="CustomActionBarTheme"
parent="@android:style/Theme.Holo">
<item name="android:windowActionBarOverlay">true</item>
</style>
</resources>
支持Android 2.1 和更高
如果为了兼容运行在Android 3.0 以下版本的设备而使用了Support 库,自定义主题必须继承 Theme.AppCompat 主题(或者其子主题)。例如:
<resources>
<!-- 为程序或者活动应用的主题样式 -->
<style name="CustomActionBarTheme"
parent="@android:style/Theme.AppCompat">
<item name="android:windowActionBarOverlay">true</item>
<!-- 兼容支持库 -->
<item name="windowActionBarOverlay">true</item>
</style>
</resources>
该主题包含两种不同的 windowActionBarOverlay
式样定义:一个带 android:
前缀,另一个不带。带前缀的适用于包含该式样的Android 系统版本,不带前缀的适用于通过从Support 库中读取式样的旧版本。
一、LayoutInflater.inflate()
该方法适用于所有布局填充的的场景,但使用前需要先实例化LayoutInflater对象
二、View.inflate()
这个是View类的静态方法,可直接调用,实际上还是使用了LayoutInflater,所以,它没有直接使用LayoutInflater.inflate()强大
适配不同的语言
把UI中的字符串存储在外部文件,通过代码提取,这是一种很好的做法
res/values/strings.xml
,用于保存字符串值
为支持多国语言,在res/
中创建一个额外的values
目录以连字符和ISO国家代码结尾命名,比如values-es/
使用字符资源
我们可以在源代码和其他XML文件中通过<string>
元素的name
属性来引用自己的字符串资源。在源代码中可以通过R.string.<string_name>
语法来引用一个字符串资源,很多方法都可以通过这种方式来接受字符串。
// Get a string resource from your app's Resources
String hello = getResources().getString(R.string.hello_world);
// Or supply a string resource to a method that requires a string
TextView textView =
new TextView(
this);
textView.setText(R.string.hello_world);
在其他XML文件中,每当XML属性要接受一个字符串值时,你都可以通过@string/<string_name>
语法来引用字符串资源。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
适配不同的屏幕
声明针对不同屏幕所用的layout和bitmap(分辨率),必须把这些可选资源放置在独立的目录中,这与适配不同语言时的做法类似。同样要注意屏幕的方向(横向或纵向)也是一种需要考虑的屏幕尺寸变化,
引用
layout/main.xml
文件,系统自动适配
创建不同的bitmap
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (基准)
- ldpi: 0.75
- 任何时候,当引用
@drawable/awesomeimage
时系统会根据屏幕的分辨率选择恰当的bitmap
适配不同的系统版本
minSdkVersion
和targetSdkVersion
属性,标明在设计和测试app时,最低兼容API的级别和最高适用的API级别(这个最高的级别是需要通过我们的测试的)。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
...
</manifest>
Android在Build常量类中提供了对每一个版本的唯一代号,在我们的app中使用这些代号可以建立条件,保证依赖于高级别的API的代码,只会在这些API在当前系统中可用时,才会执行。
private void setUpActionBar() {
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(
true);
}
}