简体   繁体   English

在Android中创建菜单/子菜单

[英]Creating a menu/submenu in android

I have very little to no experience with developing android apps. 我几乎没有开发Android应用程序的经验。 My friend asked me to create a small feature for his app. 我的朋友要我为他的应用创建一个小功能。 What I'm stuck on is creating a submenu for options, ie I have it so that when a button is clicked a menu pops up with a few options and I need it to open a second menu when a specific option is clicked. 我所坚持的是为选项创建一个子菜单,例如,我拥有它,以便在单击按钮时弹出带有一些选项的菜单,并且在单击特定选项时需要它来打开第二个菜单。 I'll post my code below (both XML and Java) in hopes that someone can help me. 我将在下面发布我的代码(XML和Java),希望有人可以帮助我。 Currently I have my menu show up through Java code and not XML code. 目前,我的菜单是通过Java代码而不是XML代码显示的。 I'm not sure if this is bad practice or not but I'll let whoever can help me tell me whether or not it is. 我不确定这是否是不好的作法,但我会让任何可以帮助我的人告诉我是否这样做。 Thanks in advance. 提前致谢。

XML Code: XML代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main"
    tools:context="com.example.android.postvu.MainActivity">

<ImageView
    android:id="@+id/imageView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/background"
    android:scaleType="centerCrop"
    android:src="@drawable/grid" />

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="8dp"
    android:text="@string/image_text_editor"
    android:textColor="@android:color/black"
    android:textSize="28sp"
    android:textStyle="bold"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="Image Text Editor" />


<Button
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="8dp"
    android:background="@mipmap/ic_launcher"
    android:scaleType="centerCrop"
    android:onClick="myOnClickMethod"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView"
    app:layout_constraintVertical_bias="0.98" />

Java Code (relating to the button being clicked and the menu showing up): Java代码(与所单击的按钮和显示的菜单有关):

public void myOnClickMethod(View v) {
    registerForContextMenu(v);
    openContextMenu(v);
}

final int CONTEXT_MENU_VIEW = 1;
final int CONTEXT_MENU_EDIT = 2;
final int CONTEXT_MENU_ARCHIVE = 3;


@Override
public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Options");
    menu.add(Menu.NONE, CONTEXT_MENU_VIEW, Menu.NONE, "Take Photo");
    menu.add(Menu.NONE, CONTEXT_MENU_EDIT, Menu.NONE, "Photo Album");
    menu.add(Menu.NONE, CONTEXT_MENU_ARCHIVE, Menu.NONE, "Plain Image");
}

@Override
public boolean onContextItemSelected (MenuItem item) {
    switch (item.getItemId()) {
        case CONTEXT_MENU_VIEW: {
        }
        break;
        case CONTEXT_MENU_EDIT: {
        }
        break;
        case CONTEXT_MENU_ARCHIVE: {
        }
        break;
    }

    return super.onContextItemSelected(item);
}

You can show a sub menu in the following way. 您可以通过以下方式显示子菜单。 I have modified your code and used hard coded constants. 我已经修改了您的代码并使用了硬编码常量。 I hope this will help you. 我希望这能帮到您。

public class MainActivity extends AppCompatActivity {
    private View menuAnchorView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        menuAnchorView = findViewById(R.id.imageView2);
        menuAnchorView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myOnClickMethod(menuAnchorView);
            }
        });
    }

    public void myOnClickMethod(View v) {
        registerForContextMenu(v);
        openContextMenu(v);
    }

    final int CONTEXT_MENU_VIEW = 1;
    final int CONTEXT_MENU_EDIT = 2;
    final int CONTEXT_MENU_ARCHIVE = 3;


    @Override
    public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        if(v.getTag() == null || !v.getTag().equals("menu_item")) {
            menu.setHeaderTitle("Options");
            menu.add(Menu.NONE, CONTEXT_MENU_VIEW, Menu.NONE, "Take Photo");
            menu.add(Menu.NONE, CONTEXT_MENU_EDIT, Menu.NONE, "Photo Album");
            menu.add(Menu.NONE, CONTEXT_MENU_ARCHIVE, Menu.NONE, "Plain Image");
        }
        else {
            menu.setHeaderTitle("Sub menu");
            menu.add(Menu.NONE, 4, Menu.NONE, "Sub-view");
            menu.add(Menu.NONE, 5, Menu.NONE, "Sub-view-2");
        }
    }

    @Override
    public boolean onContextItemSelected (MenuItem item) {
        closeContextMenu();
        switch (item.getItemId()) {
            case CONTEXT_MENU_VIEW: {
                menuAnchorView.setTag("menu_item");
                openContextMenu(menuAnchorView);
            }
            break;
            case CONTEXT_MENU_EDIT: {
            }
            break;
            case CONTEXT_MENU_ARCHIVE: {
            }
            break;
            case 4:
            case 5: menuAnchorView.setTag(null);
                break;
        }

        return super.onContextItemSelected(item);
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM