长按打开操作栏菜单 - Android

时间:2013-12-20 11:31:44

标签: java android menu android-actionbar menubar

我正在尝试仅在长按一下打开操作栏菜单(onCreateOptionsMenu)。我怎么做到这一点?目前我只需使用以下代码进行短按/点击即可工作:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    // TODO: Only onlongclick should the menu be revealed
    getMenuInflater().inflate(R.menu.my_menu_id, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_home:
            open_home();
            return true;
        case R.id.menu_how_to:
            open_how_to();
            return true;
        case R.id.menu_rate:
            open_rate();
            return true;
        case R.id.menu_about:
            open_about();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

我希望菜单只能打开一次长按(有点像隐藏/技巧功能)。我查看了onLongClickListener,但无法让它工作。菜单打开后,它可以正常运行(不再需要长时间点击)。谢谢你的帮助!真的很感激。

2 个答案:

答案 0 :(得分:2)

这是不可能的。单击ActionBar按钮不能覆盖。

它将始终显示您长按按钮名称的祝酒词。这是一个帮助和发现功能。

答案 1 :(得分:0)

好的,这有2个答案取决于你是否想要菜单中的图标:

  1. 创建上下文菜单,但菜单的每一行都不能有旁边的图标。这是一种更简单的方法。

  2. 使用菜单创建警告对话框。这要复杂得多,但您可以添加图标并使菜单更具可定制性。

  3. 由于图标,我个人更喜欢方法2。我将在下面介绍这些方法。首先,我只需设置菜单的操作栏和按钮。

    Sp首先创建一个图像按钮,在某处打开菜单。同时打开自定义操作栏。此代码适用于两种方法:

    // This goes somewhere in the activity's onCreate
    ImageButton menu_home_button = (ImageButton) findViewById(R.id.action_bar_menu_home);
    registerForContextMenu(menu_home_button); //ONLY USE THIS FOR METHOD1
    menu_home_button.setLongClickable(true);
    menu_home_button.setClickable(true);
    
    // Custom action bar
    actionBar = getActionBar();
    actionBar.setCustomView(R.layout.my_custom_actionbar);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayUseLogoEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    

    我的ImageButton叠加在右侧操作栏的顶部,在my_custom_actionbar.xml中显示如下:

    <ImageButton
        android:background="?android:selectableItemBackground"
        android:id="@+id/action_bar_menu_home"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/menu_icon"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="4dp"
        android:clickable="true"
        android:focusable="true"
        android:longClickable="true" />
    

    --------------------------------------

    方法1:

    将此添加到WebViewActivity.java中的onCreate:

    // Do the long press stuff
    menu_home_button.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Toast.makeText(getApplicationContext(), "Long Press works...", Toast.LENGTH_SHORT).show();
            // Do whatever you want on the longclick
        }
    });
    

    以下代码在onCreateOptionsMenu和onOptionsItemSelected的位置(在java类的末尾 - 我的名为WebViewActivity.java)。

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.my_menu_id, menu);
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case R.id.menu_home:
                open_home();
                return true;
            case R.id.menu_how_to:
                open_how_to();
                return true;
            case R.id.menu_rate:
                open_rate();
                return true;
            case R.id.menu_about:
                open_about();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    然后在my_menu_id.xml中创建菜单。在XML中包含图标将无法正常工作,所以不要费心去尝试:     

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.yourapp.WebViewActivity" >
    
        <item
            android:id="@+id/menu_home"
            android:title="@string/menu_home"
            android:showAsAction="never"/>
    
        <item
            android:id="@+id/menu_how_to"
            android:title="@string/menu_how_to"
            android:showAsAction="never"/>
    
        <item
            android:id="@+id/menu_rate"
            android:title="@string/menu_rate"
            android:showAsAction="never"/>
    
        <item
            android:id="@+id/menu_about"
            android:title="@string/menu_about"
            android:showAsAction="never"/>
    </menu>
    

    -----------------------------------------

    方法2:

    将此添加到WebViewActivity.java中的onCreate:

    menu_home_button.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            // Menu text
            final String[] items = {"Home", "How To", "Rate", "About"};
    
            // Menu Icons in Drawable
            final Drawable[] item_icons = {
                getResources().getDrawable(R.drawable.home_icon),
                getResources().getDrawable(R.drawable.how_to_icon),
                getResources().getDrawable(R.drawable.rate_icon),
                getResources().getDrawable(R.drawable.about_icon),
            };
    
            ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.custom_menu_dialog, items) {
                ViewHolder holder;
    
                class ViewHolder {
                    ImageView icon;
                    TextView title;
                }
    
                public View getView(int position, View convertView, ViewGroup parent) {
                    final LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                    if (convertView == null) {
                        convertView = inflater.inflate(R.layout.custom_menu_dialog, null);
                        holder = new ViewHolder();
                        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
                        holder.title = (TextView) convertView.findViewById(R.id.title);
                        convertView.setTag(holder);
                    } else {
                        // view already defined, retrieve view holder
                        holder = (ViewHolder) convertView.getTag();
                    }
    
                    holder.title.setText(items[position]);
                    holder.icon.setImageDrawable(item_icons[position]);
                    return convertView;
                }
            };
    
            Toast.makeText(getApplicationContext(), "Long Press works...", Toast.LENGTH_SHORT).show();
    
            AlertDialog.Builder menu_dialog = new AlertDialog.Builder(WebViewActivity.this); 
    
            menu_dialog.setTitle(getResources().getString("My Menu Name");
            menu_dialog.setAdapter(adapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                //Toast.makeText(WebViewActivity.this, "You selected: " + items[item], Toast.LENGTH_LONG).show();
                    switch (item) {
                        case 0:
                            open_home();
                            break;
                        case 1: // HOW TO
                            open_how_to();
                            break;
                        case 2:
                            open_rate();
                            break;
                        case 3: // ABOUT
                            open_about();
                            break;
                        default: // Do Case 0
                            open_home();
                            break;
                    }
                    dialog.dismiss();
               }
           });
           AlertDialog alert = menu_dialog.create();
           alert.show();
           return true;
        }
    });
    

    最后,这里是custom_menu_dialog.xml文件,其中包含菜单文本和图标的基本信息:

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    
        <ImageView
            android:id="@+id/icon"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center"
            android:paddingLeft="16dp"/>
    
        <TextView
            android:id="@+id/title"
            android:text=""
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#fff6f6f6"
            android:textSize="18sp"
            android:paddingLeft="16dp"
            android:paddingTop="12dp"
            android:paddingBottom="12dp"/>
    
        </LinearLayout>
    

    Hopw这有助于至少一个人出局。它肯定适合我。