关于Android Menu 的用法

来源:互联网 发布:页游制作软件 编辑:程序博客网 时间:2024/04/25 13:32
原文链接:http://mobiforge.com/designing/story/understanding-user-interface-android-part-4-more-views
在这最后一篇关于Android View的系列文章中,我们将继续探索另一个view分类- Menu views, 以及另外一些很好用的view。我们要讨论的view包括:

Context Menu
Options Menu
AnalogClock
DigitalClock
WebView
注意:对于这篇文章中的所有例子,你应当使用在前面的文章中创建的project
Menus
Menus在显示应用程序主UI上不能直接看到的额外选项的时候是非常有用的。在Android中主要有两种类型的menu
Context Menu – 在一个activity上显示有关一个特定view的信息。在Android之中,你按下context menu保持不放就可以激活它。
Options Menu – 显示有关当前activity的信息。在Android中,你按下MENU键就能激活这个options menu
1演示在浏览器应用程序中的一个options menu的例子。这个option menu在用户按下MENU按钮的时候会被显示。显示的菜单项目由当前运行的activity决定。


1 – 在浏览器应用程序中的options menu
2 演示在用户保持按下页面上显示的超链接的时候会显示的context menu。这个显示的菜单项目由当前选择的组件或试图决定。要激活这个context menu,用户选择屏幕上的一个项目,或者按下不放,或者简单地按下方向键区的中心按钮。


2 – 在浏览器应用程序中的context menu
要了解在Android中怎样实现菜单,添加一个新的文件到res/layout文件夹,命名menu.xml 填充如下元素:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 
    <Button android:id="@+id/btn1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text = "Hello, world!"
        />           
 
</LinearLayout>
Then, add a new class to the src/net.learn2develop.AndroidViews folder and name it as MenuExample.java. You will leave this file alone for now. Modify the AndroidManifest.xml file to register the new activity:
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="net.learn2develop.AndroidViews"

      android:versionCode="1"

      android:versionName="1.0.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".ViewsActivity"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <activity android:name=".MenuExample"
                  android:label="@string/app_name" />
 
    </application>
</manifest>
Creating the Helper Methods
For the examples in this section, you will create two helper methods in the MenuExample.java file. They are CreateMenu() and MenuChoice(). Define the two helper methods and the onCreate() method as shown below:
package net.learn2develop.AndroidViews;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;
 
public class MenuExample extends Activity
{   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.menu);       
        Button btn = (Button) findViewById(R.id.btn1);       
        btn.setOnCreateContextMenuListener(this);
    }
 
    private void CreateMenu(Menu menu)
    {
        menu.setQwertyMode(true);
        MenuItem mnu1 = menu.add(0, 0, 0, "Item 1");
        {
            mnu1.setAlphabeticShortcut('a');
            mnu1.setIcon(R.drawable.alert_dialog_icon);           
        }
        MenuItem mnu2 = menu.add(0, 1, 1, "Item 2");
        {
            mnu2.setAlphabeticShortcut('b');
            mnu2.setIcon(R.drawable.ic_popup_reminder);            
        }
        MenuItem mnu3 = menu.add(0, 2, 2, "Item 3");
        {
            mnu3.setAlphabeticShortcut('c');
            mnu3.setIcon(R.drawable.icon);
        }
        MenuItem mnu4 = menu.add(0, 3, 3, "Item 4");
        {
            mnu4.setAlphabeticShortcut('d');                   
        }
        menu.add(0, 3, 3, "Item 5");
        menu.add(0, 3, 3, "Item 6");
        menu.add(0, 3, 3, "Item 7");
    }
 
    private boolean MenuChoice(MenuItem item)
    {       
        switch (item.getItemId()) {
        case 0:
            Toast.makeText(this, "You clicked on Item 1",
                Toast.LENGTH_LONG).show();
            return true;
        case 1:
            Toast.makeText(this, "You clicked on Item 2",
                Toast.LENGTH_LONG).show();
            return true;
        case 2:
            Toast.makeText(this, "You clicked on Item 3",
                Toast.LENGTH_LONG).show();
            return true;
        case 3:
            Toast.makeText(this, "You clicked on Item 4",
                Toast.LENGTH_LONG).show();
            return true;
        case 4:
            Toast.makeText(this, "You clicked on Item 5",
                Toast.LENGTH_LONG).show();
            return true;
        case 5:
            Toast.makeText(this, "You clicked on Item 6",
                Toast.LENGTH_LONG).show();
            return true;
        case 6:
            Toast.makeText(this, "You clicked on Item 7",
                Toast.LENGTH_LONG).show();
            return true;           
        }
        return false;
    }   
}
CreateMenu() method 创建一列菜单项目,修改每个菜单项目的行为。add() method的参数是:groupid(组识别码),itemid(项目识别码),order(顺序),以及title(标题)。setAlphabeticShortcut() method分配一个键盘捷径到菜单项目上,这样当用户按下一个特定的键之后,某个菜单项目就会被选中。setIcon() method分配一个图标给菜单项目。
MenuChoice() method使用Toast class显示选中的菜单项目。然后,复制两个图片(正如图3所示)res/drawable文件夹中。


3 – 添加图片到res/drawable 文件夹
Options Menu
要为你的activity显示options menu,你需要覆写两个method – onCreateOptionsMenu() 以及onOptionsItemSelected()onCreateOptionsMenu() methodMENU按钮被按下的时候被调用。在这个事件中,你可以调用CreateMenu()辅助函数method来显示options menu。当一个菜单项目被选中时,onOptionsItemSelected() method将会被调用。在这种情况下,你调用MenuChoice() method 来显示选中的菜单项目(然后做你要做的东西)
public class MenuExample extends Activity
{   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.menu);       
    }

 

    private void CreateMenu(Menu menu)

    {
        //...
    }
 
    private boolean MenuChoice(MenuItem item)
    {       
        //...
    }    
 
    //---only created once---
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        CreateMenu(menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {   
         return MenuChoice(item);   
    }
 
}
如下修改ViewsActivity.java 文件,启动MenuExample activity
package net.learn2develop.AndroidViews;
 
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
 
public class ViewsActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        startActivity(new Intent(this, MenuExample.class));
    }
}
按下F11调试应用程序。但你按下MENU键的时候,你将看到options menu 如图4所示:


4 – 在你的应用程序中显示一个options menu
观察为菜单项目123显示的图标。并且,如果这个options menu有超过六个项目,就会有一个More menu项目来代表额外菜单项目。 4的右边显示按下More项目把额外菜单项目作为列表显示。
Context Menu
如果你想要在一个activity上把一个 context menu 与一个view相联系的话,你需要调用那个特定的viewsetOnCreateContextMenuListener() method。例如,下面的代码就向你演示了怎样把一个context menu Button view联系起来:
package net.learn2develop.AndroidViews;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.ContextMenu.ContextMenuInfo;

import android.widget.Button;

import android.widget.Toast;
 
public class MenuExample extends Activity
{   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.menu);     
 
        Button btn = (Button) findViewById(R.id.btn1);       
        btn.setOnCreateContextMenuListener(this);
    }
 
    private void CreateMenu(Menu menu)
    {
        //...
    }
 
    private boolean MenuChoice(MenuItem item)
    {       
        //...
    }
 
    //---only created once---
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        super.onCreateOptionsMenu(menu);
        CreateMenu(menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {   
         return MenuChoice(item);   
    }
 
    @Override
    public void onCreateContextMenu(ContextMenu menu, View view,
    ContextMenuInfo menuInfo)
    {
         super.onCreateContextMenu(menu, view, menuInfo);
         CreateMenu(menu);
    }
 
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {   
         return MenuChoice(item);   
    }   
 
}
就像Options menu一样,你需要覆写onCreateContextMenu()method onContextItemSelected() method。在Eclipse中按下F11调试应用程序。按下Button view保持几秒钟。现在你就可以看到那个context menu (参考图5)。观察菜单项目14的键盘捷径在菜单名称的下面显示出来了。


5 – 在你的应用程序中显示context menu
Some Additional Views
除了到此为止你已经看到的标准viewAndroid SDK还提供了一些有趣的view,可以让你的应用程序更加有趣。在下面的部分中,你可以了解更多的view
AnalogClock
DigitalClock
WebView
AnalogClock and DigitalClock Views
AnalogClock view显示一个指针式时钟。用以下元素填充这个main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    > 
 
    <AnalogClock android:id="@+id/clock1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
 
</LinearLayout>
ViewsActivity.java 文件中,确保main.xml文件作为UIactivity加载:
package net.learn2develop.AndroidViews;
 
import android.app.Activity;
import android.os.Bundle;
 
public class ViewsActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
    }
}
当你现在按下F11 的时候,你会看到指针式时钟显示出来了,如图6


6 – 活动中的AnalogClock