Android actionbar 笔记

447 查看

按照 Android Studio 内置的例子做了个 actionbar 的 Demo,现在写下来做笔记,IDE 为 Android Studio 1.2

完成的截图如下:

AndroidMenifest.xml

xml<?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:

xml<?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

xml<?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

因为只有一段说明文字,所以一个 <TextView> 足矣,通过 android:text 引用上面定义好的字符串。

文字位于屏幕中间,可以通过 android:gravity="center" 属性处理,并且设置 android:layout_width="match_parent"android:layout_height="match_parent"

为了看起来更舒服,所以加了个 android:padding="16dp" 属性。

res/layout/sample_main.xml

xml<?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:title

showAsAction 需要使用不同的命名空间,这里用 support 表示,ifRoom 表示有空间就显示,never 表示永远不显示,也就是点击那个菜单汉堡包才显示。

res/menu/main.xml

xml<?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 类,先导入:

javaimport android.view.MenuItem;
import android.view.Menu;

用到在 Menu 的方法是:

javapublic abstract MenuItem add (int groupId, int itemId, int order, CharSequence title);
  • groupId 代表组概念,如果想对 Item 进行分组管理这个会用得上,如果该 Item 不在组内则使用 None

  • itemId 代表 ItemID,必须是独一无二的,如果不需要 itemID 则使用 None

  • orderId 代表 Item 所在的顺序,注意是在动态创建 Item 中的顺序,如果不需要,使用 None

  • title 表示 Itemandroid:title 属性。

不过得事先写一个独一无二的 IDItem 创建调用:

res/values/ids.xml

xml<?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>

动态创建代码如下:

java@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 也就是:

xml<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,使用方法是:

javaToast.makeText(context, text, duration).show();

以下是代码实现:

java
@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

javapackage 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);
    }
}