この記事を読むには、Androidメニューバーメニューの使用法の説明で十分です

メニューバーメニューの使い方説明

少しの知識、大きな挑戦!この記事は、「プログラマーのためのヒント」の作成に参加しています。

この記事は 、 クリエイティブなギフトパッケージを獲得し、クリエイティブなインセンティブに挑戦するための「エクスプロイトスタープログラム」に参加しています。

メニューはAndroidアプリの非常に重要で一般的な部分です。これにより、ページで使用されるスペースを大幅に節約し、ページの使用率を向上させることができます。Androidには3つの一般的なメニューがあります。

  • OptionMenu:オプションメニュー、Androidで最も一般的なメニューで、メニューキーによって呼び出されます
  • ContextMenu:コンテキストメニュー、ビューコンポーネントを長押しした後に表示されるメニュー、コンポーネントはコンテキストメニューを登録する必要があります
  • サブメニュー:サブメニュー、Androidでサブメニューをクリックすると、サブメニュー項目を示すフローティングボックスがポップアップ表示されます。サブメニューはネストをサポートしていません。つまり、他のサブメニューを含めることはできません。

メニューの定義方法

  • 1つは、メニューXMLファイルを書き込んでから、次のように呼び出します。getMenuInflater()。inflate(R.menu.menu_main、menu);メニューをロードします。
  • onCreateOptionsMenuのパラメータメニューであるコードを動的に追加し、addメソッドを呼び出してメニューを追加します。add(グループ番号、ID、並べ替え番号、メニュー項目のタイトル)、および並べ替え番号が追加順に並べ替えられている場合は、 0を入力してください!

通常、XMLを使用してメニューを定義します。これにより、Javaコードの肥大化したコードを減らすことができ、毎回IDを割り当てるためにコードを使用する必要はありません。XMLファイルを変更してメニューのコンテンツを変更するだけで、ある程度、プログラムは、より良いデカップリング、低カップリング、高凝集度を提供します

3つのXML要素を使用してメニューを定義できます<menu><item><group>

<menu>メニュー項目のコンテナです。<menu>要素はファイルのルートノードである必要があり、1つ以上の<item>AND<group>要素を含めることができます。<item>はメニュー項目であり、定義に使用されます。サブメニューを作成するためにMenuItem要素をネストできます。要素の非表示のコンテナです(オプション)。これを使用してメニュー項目をグループ化し、メニュー項目のグループが使いやすさや可視性などの属性を共有するようにすることができます。<menu><group><item>

その中で、<item>私たちの主な要素であり、その一般的な属性は次のとおりです。

android:id:メニュー項目の一意の識別子(MenuItem)android:icon:メニュー項目のアイコン(オプション)android:title:メニュー項目のタイトル(必須)android:showAsAction:メニュー項目の表示方法を指定します。一般的に使用されるのは、、、、ifRoomneverありalwayswithText複数の属性値は|で区切ることができます。

1.オプションメニュー(OptionMenu)

1.一般的に使用される方法:

//调用OptionMenu,在这里完成菜单初始化和加载
public boolean onCreateOptionsMenu(Menu menu)
//菜单项被选中时触发,这里完成事件处理
public boolean onOptionsItemSelected(MenuItem item)

//菜单关闭会调用该方法
public void onOptionsMenuClosed(Menu menu)
//选项菜单显示前会调用该方法, 可在这里进行菜单的调整(动态加载菜单列表)
public boolean onPrepareOptionsMenu(Menu menu)
//选项菜单打开以后会调用这个方法
public boolean onMenuOpened(int featureId, Menu menu)
复制代码

2.例

これを達成するのは非常に簡単です。

ここに画像の説明を挿入

達成:

プロジェクト構造

ここに画像の説明を挿入

  1. まず、resリソースディレクトリにメニューフォルダを作成してから、

menu_optionmenu.xmlという名前のメニューリソースファイル

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu1"
        android:title="创建群聊"
        android:icon="@drawable/groupchat"/>
    <item
        android:id="@+id/menu2"
        android:title="加好友/群"
        android:icon="@drawable/add"/>
    <item
        android:id="@+id/menu3"
        android:title="一起派对"
        android:icon="@drawable/party"/>
    <item
        android:id="@+id/menu4"
        android:title="扫一扫"
        android:icon="@drawable/scan"/>
    <item
        android:id="@+id/menu5"
        android:title="面对面快传"
        android:icon="@drawable/quick_pass"/>
    <item
        android:id="@+id/menu6"
        android:title="收付款"
        android:icon="@drawable/payment"/>
</menu>
复制代码
  1. Javaコード
public class MainActivity extends AppCompatActivity {


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

        mTextView=findViewById(R.id.text);
    }

    //该方法用于创建显示Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_optionmenu,menu);
        return true;
    }

    //在选项菜单打开以后会调用这个方法,设置menu图标显示(icon)
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        if (menu != null) {
            if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
                try {
                    Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    method.setAccessible(true);
                    method.invoke(menu, true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return super.onMenuOpened(featureId, menu);
    }

    //该方法对菜单的item进行监听
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        mTextView.setText(item.getTitle());
        switch (item.getItemId()) {
            case R.id.menu1:
                Toast.makeText(this, "点击了第" + 1 + "个", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu2:
                Toast.makeText(this, "点击了第" + 2 + "个", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu3:
                Toast.makeText(this, "点击了第" + 3 + "个", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu4:
                Toast.makeText(this, "点击了第" + 4 + "个", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu5:
                Toast.makeText(this, "点击了第" + 5 + "个", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

复制代码

Javaコードを使用してメニューを作成する場合は、onCreateOptionsMenuメソッドのmenuのaddメソッドを使用してメニューを追加するだけで済みます。

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //add的参数(菜单项的组号,ID,排序号,标题)
        menu.add(1,1,1,"创建群聊");
        menu.add(1,1,2,"加好友/群");
        menu.add(1,1,3,"一起派对");
        menu.add(1,1,4,"扫一扫");
        menu.add(1,1,5,"面对面快传");
        menu.add(1,1,6,"收付款");
        //getMenuInflater().inflate(R.menu.menu_mian,menu);
        return true;
    }
复制代码

次に、コンテキストメニュー(ContextMenu)

1.次の手順を使用します。

  1. onCreateContextMenu()メソッドをオーバーライドします
  2. ビューコンポーネントのコンテキストメニューを登録し、registerForContextMenu()メソッドを使用します。パラメーターはViewです。
  3. onContextItemSelected()メソッドをオーバーライドして、メニュー項目のイベントリスナーを指定します

2.例

ここに画像の説明を挿入

達成:
  1. メニューファイルの下に新しいmenu_context.xmlを作成します
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 定义一组单选按钮 -->
    <!-- checkableBehavior的可选值由三个:single设置为单选,all为多选,none为普通选项 -->
    <group android:checkableBehavior="none">
        <item android:id="@+id/blue" android:title="蓝色"/>
        <item android:id="@+id/green" android:title="绿色"/>
        <item android:id="@+id/red" android:title="红色"/>
        <item android:id="@+id/yellow" android:title="黄色"/>
    </group>
</menu>
复制代码
  1. Javaコード
public class MainActivity extends AppCompatActivity {


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

        mTextView=findViewById(R.id.text);

        registerForContextMenu(mTextView);//注册上下文菜单
    }

    //重写上下文菜单的创建方法
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_context, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //上下文菜单的点击事件
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.blue:
                mTextView.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                mTextView.setTextColor(Color.GREEN);
                break;
            case R.id.red:
                mTextView.setTextColor(Color.RED);
                break;
            case R.id.yellow:
                mTextView.setTextColor(Color.YELLOW);
                break;
        }
        return super.onContextItemSelected(item);
    }
}

复制代码

3.サブメニュー(サブメニュー)

サブメニューは、< item >にネストされた< menu >のレイヤーです。または、さらに1つのレイヤーにネストすることもできます。

1.例:

ここに画像の説明を挿入

  1. メニューファイルの下に新しいmenu_sub.xmlを作成します
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/colour" android:title="变颜色~">
        <menu>
            <group android:checkableBehavior = "none">
                <item android:id="@+id/colour_blue" android:title="蓝色"/>
                <item android:id="@+id/colour_green" android:title="绿色"/>
                <item android:id="@+id/colour_red" android:title="红色"/>
                <item android:id="@+id/colour_yellow" android:title="黄色"/>
            </group>
        </menu>
    </item>
    <item android:id="@+id/font_size" android:title="变字体大小~">
        <menu>
            <group android:checkableBehavior = "none">
                <item android:id="@+id/font_size_10sp" android:title = "10sp"/>
                <item android:id="@+id/font_size_30sp" android:title = "30sp"/>
                <item android:id="@+id/font_size_50sp" android:title = "50sp"/>
                <item android:id="@+id/font_size_70sp" android:title = "70sp"/>
            </group>
        </menu>
    </item>
    <item android:id="@+id/text" android:title="变文字~">
        <menu>
            <group android:checkableBehavior = "none">
                <item android:id="@+id/text_hello" android:title = "你好"/>
                <item android:id="@+id/text_menu" android:title = "菜单"/>
                <item android:id="@+id/text_MQ" android:title = "毛小钱"/>
                <item android:id="@+id/text_div" android:title = "自定义"/>
            </group>
        </menu>
    </item>
</menu>
复制代码
  1. Javaコード
public class MainActivity extends AppCompatActivity {


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

        mTextView=findViewById(R.id.text);

        registerForContextMenu(mTextView);//注册上下文菜单
    }

    //重写上下文菜单的创建方法
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_sub, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //上下文菜单的点击事件
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.colour_blue:
                mTextView.setTextColor(Color.BLUE);
                break;
            case R.id.colour_green:
                mTextView.setTextColor(Color.GREEN);
                break;
            case R.id.colour_red:
                mTextView.setTextColor(Color.RED);
                break;
            case R.id.colour_yellow:
                mTextView.setTextColor(Color.YELLOW);
                break;
            case R.id.font_size_10sp:
                mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
                break;
            case R.id.font_size_30sp:
                mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,30);
                break;
            case R.id.font_size_50sp:
                mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,50);
                break;
            case R.id.font_size_70sp:
                mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,70);
                break;
            case R.id.text_hello:
            case R.id.text_menu:
            case R.id.text_MQ:
                mTextView.setText(item.getTitle());
                break;
            case R.id.text_div:
                final EditText editText = new EditText(this);
                AlertDialog dialog = new AlertDialog.Builder(this).setTitle("请输入要自定义的文字")
                        .setView(editText)
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                mTextView.setText(editText.getText().toString());
                            }
                        })
                        .setNegativeButton("取消",null)
                        .show();
                break;
        }
        return super.onContextItemSelected(item);
    }
}
复制代码

メニューの使用については、こちらをご覧ください。

いいねして行こう!

おすすめ

転載: juejin.im/post/7013970285393084423