Justin's Words

Android actionbar 笔记

按照 Android Studio 内置的例子做了个 actionbar 的 Demo,现在写下来做笔记,IDE 为 Android Studio v1.2。 完成的截图如下:

AndroidMenifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.youngdze.startup"
android:versionCode="1"
android:versionName="1.0">

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat"
android:allowBackup="true">

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

String 从截图可看出有一段很长的说明文字,且文字位于中间,长文字可以在用 CDATA 保存,所以写好需要的字符串。 res/values/base-strings.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="app_name">ActionBar</string>
<string name="intro_message">
<![CDATA[

This sample shows you how to use ActionBarCompat to create a basic Activity which
displays action items. It covers inflating items from a menu resource, as well as adding
an item in code. Items that are not shown as action items on the Action Bar are
displayed in the action bar overflow.

]]>
</string>
</resources>

res/values/strings.xml

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="menu_refresh">Refresh</string>
<string name="menu_location">Location</string>
<string name="menu_settings">Settings</string>
</resources>

Activity UI 因为只有一段说明文字,所以一个 足矣,通过 android:text 引用上面定义好的字符串。 文字位于屏幕中间,可以通过 android:gravity="center" 属性处理,并且设置 android:layout_width="match_parent"android:layout_height="match_parent"。 为了看起来更舒服,所以加了个 android:padding="16dp" 属性。 _res/layout/sample_main.xml_

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:text="@string/intro_message"
android:gravity="center" />

Menu 事实上 Location 项是打算通过 ActivityonCreateOptionsMenu() 来创建,所以现在只写两个 <item>。 基本的属性都定义好,包括 android:idandroid:iconandroid:titleshowAsAction 需要使用不同的命名空间,这里用 support 表示,ifRoom 表示有空间就显示,never 表示永远不显示,也就是点击那个菜单汉堡包才显示。 res/menu/main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:support="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/menu_refresh"
android:icon="@drawable/ic_action_refresh"
android:title="@string/menu_refresh"
support:showAsAction="ifRoom" />

<item android:id="@+id/menu_settings"
android:icon="@drawable/ic_action_settings"
android:title="@string/menu_settings"
support:showAsAction="never" />

</menu>

MainActivity 动态创建 Location Item 创建 Menu Item 会用到 MenuItem 类 和 Menu 类,先导入:

1
2
import android.view.MenuItem;
import android.view.Menu;

用到在

Menu 类中的方法是:

1
public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title);
  • groupId 代表组概念,如果想对 Item 进行分组管理这个会用得上,如果该 Item 不在组内则使用 None。
  • itemId 代表 Item 的 ID,必须是独一无二的,如果不需要 itemID 则使用 None。
  • orderId 代表 Item 所在的顺序,注意是在动态创建 Item 中的顺序,如果不需要,使用 None。
  • title 表示 Item 的 android:title 属性。 不过得事先写一个独一无二的

IDItem 创建调用: res/values/ids.xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--
Generate an id which can be used when the location menu item is added in MainActivity
-->
<item name="menu_location" type="id"/>

</resources>

动态创建代码如下:

1
2
3
4
5
6
7
8
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
MenuItem locationItem = menu.add(0, R.id.menu_location, 0, R.string.menu_location);
location.setIcon(R.drawable.ic_action_location);
MenuItemCompat.setShowAsAction(locationItem, MenuItemCompat, SHOW_AS_ACTION_IF_ROOM);
...
}

其实转为 XML 也就是:

1
2
3
4
<item android:id="@+id/menu_location"
android:icon="@drawable/ic_action_location"
android:title="@string/menu_location"
support:showAsAction="ifRoom" />

Item 分别处理 这里重写的方法是 onOptionItemSeleted(MenuItem item),通过 item.getItemid() 识别所选的 Item。 可以用 ToastmakeText() 方法弹出提示现在点击的是哪个 Item,使用方法是:

1
Toast.makeText(context, text, duration).show();

以下是代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
Toast.makeText(this, "Refresh!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_location:
Toast.makeText(this, "Location!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_settings:
Toast.makeText(this, "Setting!", Toast.LENGTH_SHORT).show();
return true;
}

return super.onOptionsItemSelected(item);
}

全部

Activity 代码如下: java/co/youngdze/startup/MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package co.youngdze.startup;

import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);

MenuItem locationItem = menu.add(0, R.id.menu_location, 0, R.string.menu_location);
locationItem.setIcon(R.drawable.ic_action_location);
MenuItemCompat.setShowAsAction(locationItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
Toast.makeText(this, "Refresh!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_location:
Toast.makeText(this, "Location!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_settings:
Toast.makeText(this, "Setting!", Toast.LENGTH_SHORT).show();
return true;
}

return super.onOptionsItemSelected(item);
}
}