菜单

原文内容:https://developer.android.com/guide/topics/ui/menus.html#options-menu

  • Options Menu
  • Context Menu
    • floating context menu

Options Menu

  • Android2.3(API 10)以及一下版本,Options Menu的内容在屏幕的下方,超过六个菜单项的时候,会将显示前五个菜单,后面的菜单放于More下,如图Figure1。
    菜单_第1张图片
    Figure1

  • Android3.0(API 11)以及以上版本,Options Menu的内容会显示在App Bar上。可以一些Item显示到App Bar上,如添加android:showAsAction=”ifRoom”属性,如图Figure2。
    菜单_第2张图片
    Figure2

res/menu/game_menu.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" >
    <item  android:id="@+id/file" android:title="file" android:showAsAction="ifRoom" tools:ignore="AppCompatResource" />

    <item  android:id="@+id/edit" android:title="edit" />

    <item  android:id="@+id/tool" android:title="tool" />
    <item  android:id="@+id/help" android:title="help" />
</menu>

package com.app.menutest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.game_menu,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.file:
                    Toast.makeText(this,"file is clicked",Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.edit:
                    Toast.makeText(this,"edit is clicked",Toast.LENGTH_SHORT).show();
                    return true;
            case R.id.tool:
                    Toast.makeText(this,"tool is clicked",Toast.LENGTH_SHORT).show();
                    return true;
            case R.id.help:
                    Toast.makeText(this,"help is clicked",Toast.LENGTH_SHORT).show();
                    return true;
            default:
                    return super.onOptionsItemSelected(item);
        }
    }
}

菜单_第3张图片

提示:

  • Android3.0之后添加了android:onClick属性,属性的值必须与Activity中定义的方法名一致且必须为public,并且只接收一个MenuItem参数。
  • 如果你的应用程序中包含多个界面,并且这些界面共享相同的菜单。可以考虑新建一个Activity,然后实现onCreateOptionsMenu( )与onOptionsItemSelected( )方法。然后让各个Activity来继承这个Activity,这样实现了共享同一份菜单。若后面的Activity想要添加Menu,可以重写onCreateOptionsMenu( )方法,调用super.onCreateOptionsMenu( )生成原始菜单项,然后menu.add( )。或者完全重写菜单项都可以



运行的时候动态改变菜单

  • 当系统调用了onCreateOptionsMenu( ),它保存了Menu的实例对象,除非因为某些原因Menu失效了,否则不会再调用onCreateOptionsMenu( )。onCreateOptionsMenu( )在Activity的生命周期中用来初始化Menu,不要在其里面修改Menu。
  • 在Activity的生命周期中,如果你想要通过点击事件来完成Options Menu的修改,你可以通过onPrepareOptionsMenu( )方法来完成。可以完成add,remove,disable等操作。
  • 在Android2.3以及更低版本下,当用户每次打开Options Menu的时候,系统都会调用onPrepareOptionsMenu( )方法
  • 在Android3.0已经更高版本上,因为Options Menu在App Bar上显示,所以被认为总是打开的。当事件发生的时候,需要更新菜单,你必须调用invalidateOptionsMenu( )方法来请求系统调用onPrepareOptionsMenu( )方法。

Context Menu

floating context menu

创建floating context menu步骤

  • 调用registerContextMenu( )方法,将Menu与View进行关联。
    如果使用ListView或者GridView的时候,需要和每个子项View进行关联。

  • 在Activity或者Fragment中,实现onCreateContextMenu( )方法。
    当长时间按住注册Menu的View的时候,系统会调用onCreateContextMenu( )方法来初始化菜单。

  • 在Activity或者Fragment中,实现onContextItemSelected()方法
    当用户选择菜单项的时候,系统会调用这个方法,便于用户执行具体的动作。默认情况下,对于Activity或者Fragment中,super.onContextItemSelected( )返回的是false。

res/menu/game_menu.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" >
    <item  android:id="@+id/file" android:title="file" android:showAsAction="ifRoom" tools:ignore="AppCompatResource" />

    <item  android:id="@+id/edit" android:title="edit" />

    <item  android:id="@+id/tool" android:title="tool" />
    <item  android:id="@+id/help" android:title="help" />
</menu>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <TextView  android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="内容" android:textSize="40sp"/>


</RelativeLayout>

菜单_第4张图片

MainActivity.java

package com.app.menutest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;

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

        textView = (TextView) findViewById(R.id.text_view);
        registerForContextMenu(textView);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu,v,menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.game_menu,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()){
            case R.id.file:
                textView.setText("File");
                return true;
            case R.id.edit:
                textView.setText("Edit");
                return true;
            case R.id.tool:
                textView.setText("Tool");
                return true;
            case R.id.help:
                textView.setText("Help");
            default:
                return super.onContextItemSelected(item);
        }
    }
}

菜单_第5张图片

你可能感兴趣的:(菜单)