RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 559242
Accepted
Боков Глеб
Боков Глеб
Asked:2020-08-25 16:49:55 +0000 UTC2020-08-25 16:49:55 +0000 UTC 2020-08-25 16:49:55 +0000 UTC

一项活动中有两个或更多菜单

  • 772

如何在android编程中为一个活动添加两个或多个菜单?

假设我们要添加一个顶部菜单(三个垂直点和一个带有应用程序名称的标题),即使对于初学者来说也不难,并且在外观上与Navigation Drawer Activity中的菜单相同,只是不可伸缩,但是静态,始终显示(粗略安装的图像最终结果):

在此处输入图像描述

  • 如果你在 中粘贴另一个菜单onCreateOptionsMenu,那么你只会得到一个包含两个元素的菜单:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.options_menu, menu);
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
    
  • 两种方法onCreateOptionsMenu(Menu menu)自然不能。


更新:这大致是我想做的(忽略语言;任何“鱼”都可以,甚至是传统的 lorem ipsum)。红色是顶部的下拉菜单,我标记为紫色的任何框都可以单击并重定向到另一个活动。几乎是一组按钮,只是每个按钮都有一个大图标,一个小图标和两个标签。

在此处输入图像描述

android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    nick
    2020-08-28T21:37:27Z2020-08-28T21:37:27Z

    一项活动中不能有多个菜单。我可以为您提供一个略有不同的选择。

    我们在 ActionBar 中创建两个按钮。i1.xml文件

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.example.I1" >
    
        <item
            android:id="@+id/action_menu1"
            android:icon="@drawable/ic_launcher"
            android:text="@string/action_menu1"
            app:showAsAction="always" />
    
        <item
            android:id="@+id/action_menu2"
            android:icon="@drawable/ic_launcher"
            android:text="@string/action_menu2"
            app:showAsAction="always" />
    
    </menu>
    

    这就是最终的样子:

    一

    这些按钮将充当菜单按钮。这是活动代码。I1.java文件

    package com.example.example;
    
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    
    public class I1 extends AppCompatActivity {
    
        private String[] i1 = new String[]{"Первый пункт", "Второй пункт", "Третий пункт"};
        private String[] i2 = new String[]{"Пункт А", "Пункт Б"};
    
        @Override
        protected void onCreate(Bundle i1) {
            super.onCreate(i1);
            setContentView(R.layout.layout_i1);
            return;
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu i1) {
            getMenuInflater().inflate(R.menu.i1, i1);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem i1) {
            AlertDialog.Builder i2 = new AlertDialog.Builder(this);
            i2.setCancelable(true);
            switch (i1.getItemId()) {
            case R.id.action_menu1:
                i2.setIcon(R.drawable.ic_launcher);
                i2.setTitle(getString(R.string.action_menu1));
                i2.setItems(this.i1, new DialogInterface.OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface i1, int i2) {
                        i1.cancel();
                        Toast.makeText(I1.this, "Выбран пункт:" + "\n" + I1.this.i1[i2], Toast.LENGTH_LONG).show();
                        return;
                    }
    
                });
                break;
            case R.id.action_menu2:
                i2.setIcon(R.drawable.ic_launcher);
                i2.setTitle(getString(R.string.action_menu2));
                i2.setItems(this.i2, new DialogInterface.OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface i1, int i2) {
                        i1.cancel();
                        Toast.makeText(I1.this, "Выбран пункт:" + "\n" + I1.this.i2[i2], Toast.LENGTH_LONG).show();
                        return;
                    }
    
                });
                break;
            }
            i2.create().show();
            return super.onOptionsItemSelected(i1);
        }
    
    }
    

    单击它们会打开一个AlertDialog包含项目的工作表。用户只需选择所需的项目。

    2个

    3个


    为了在Activity的底部做一​​个圆形的悬浮按钮,如图

    四

    您需要创建一个名为 的新类FloatingActionButton,将此代码粘贴到其中:

    package com.example.example;
    
    import android.animation.AnimatorSet;
    import android.animation.ObjectAnimator;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.view.Gravity;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.AccelerateInterpolator;
    import android.view.animation.OvershootInterpolator;
    import android.widget.FrameLayout;
    
    public class FloatingActionButton extends View {
    
        final static OvershootInterpolator overshootInterpolator = new OvershootInterpolator();
        final static AccelerateInterpolator accelerateInterpolator = new AccelerateInterpolator();
    
        Context context;
        Paint mButtonPaint;
        Paint mDrawablePaint;
        Bitmap mBitmap;
        boolean mHidden = false;
    
        public FloatingActionButton(Context context) {
            super(context);
            this.context = context;
            init(Color.WHITE);
        }
    
        public void setFloatingActionButtonColor(int FloatingActionButtonColor) {
            init(FloatingActionButtonColor);
        }
    
        public void setFloatingActionButtonDrawable(Drawable FloatingActionButtonDrawable) {
            mBitmap = ((BitmapDrawable) FloatingActionButtonDrawable).getBitmap();
            invalidate();
        }
    
        public void init(int FloatingActionButtonColor) {
            setWillNotDraw(false);
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mButtonPaint.setColor(FloatingActionButtonColor);
            mButtonPaint.setStyle(Paint.Style.FILL);
            mButtonPaint.setShadowLayer(10.0f, 0.0f, 3.5f, Color.argb(100, 0, 0, 0));
            mDrawablePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            invalidate();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            setClickable(true);
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, (float) (getWidth() / 2.6), mButtonPaint);
            canvas.drawBitmap(mBitmap, (getWidth() - mBitmap.getWidth()) / 2, (getHeight() - mBitmap.getHeight()) / 2, mDrawablePaint);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                setAlpha(1.0f);
            } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
                setAlpha(0.6f);
            }
            return super.onTouchEvent(event);
        }
    
        public void hideFloatingActionButton() {
            if (!mHidden) {
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 1, 0);
                ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 1, 0);
                AnimatorSet animSetXY = new AnimatorSet();
                animSetXY.playTogether(scaleX, scaleY);
                animSetXY.setInterpolator(accelerateInterpolator);
                animSetXY.setDuration(100);
                animSetXY.start();
                mHidden = true;
            }
        }
    
        public void showFloatingActionButton() {
            if (mHidden) {
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 0, 1);
                ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 0, 1);
                AnimatorSet animSetXY = new AnimatorSet();
                animSetXY.playTogether(scaleX, scaleY);
                animSetXY.setInterpolator(overshootInterpolator);
                animSetXY.setDuration(200);
                animSetXY.start();
                mHidden = false;
            }
        }
    
        public boolean isHidden() {
            return mHidden;
        }
    
        static public class Builder {
            private FrameLayout.LayoutParams params;
            private final Activity activity;
            int gravity = Gravity.BOTTOM | Gravity.RIGHT; // default bottom right
            Drawable drawable;
            int color = Color.WHITE;
            int size = 0;
            float scale = 0;
            public Builder(Activity context) {
                scale = context.getResources().getDisplayMetrics().density;
                size = convertToPixels(72, scale); // default size is 72dp by 72dp
                params = new FrameLayout.LayoutParams(size, size);
                params.gravity = gravity;
                this.activity = context;
            }
    
            /**
             * Sets the gravity for the FAB
             */
            public Builder withGravity(int gravity) {
                this.gravity = gravity;
                return this;
            }
    
            /**
             * Sets the margins for the FAB in dp
             */
            public Builder withMargins(int left, int top, int right, int bottom) {
                params.setMargins(
                        convertToPixels(left, scale),
                        convertToPixels(top, scale),
                        convertToPixels(right, scale),
                        convertToPixels(bottom, scale));
                return this;
            }
    
            /**
             * Sets the FAB drawable
             */
            public Builder withDrawable(final Drawable drawable) {
                this.drawable = drawable;
                return this;
            }
    
            /**
             * Sets the FAB color
             */
            public Builder withButtonColor(final int color) {
                this.color = color;
                return this;
            }
    
            /**
             * Sets the FAB size in dp
             */
            public Builder withButtonSize(int size) {
                size = convertToPixels(size, scale);
                params = new FrameLayout.LayoutParams(size, size);
                return this;
            }
    
            public FloatingActionButton create() {
                final FloatingActionButton button = new FloatingActionButton(activity);
                button.setFloatingActionButtonColor(this.color);
                button.setFloatingActionButtonDrawable(this.drawable);
                params.gravity = this.gravity;
                ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content);
                root.addView(button, params);
                return button;
            }
    
            // The calculation (value * scale + 0.5f) is a widely used to convert to dps to pixel units
            // based on density scale
            // see developer.android.com (Supporting Multiple Screen Sizes)
            private int convertToPixels(int dp, float scale) {
                return (int) (dp * scale + 0.5f) ;
            }
    
        }
    }
    

    然后,在onCreate()您的 Activity 方法中,粘贴以下代码:

    FloatingActionButton i2 = new FloatingActionButton.Builder(this)
        .withDrawable(getResources().getDrawable(R.drawable.ic_action_add)) // картинка твоей кнопки
        .withButtonColor(Color.RED) // красный цвет
        .withGravity(Gravity.BOTTOM | Gravity.RIGHT) // расположение справа снизу
        .withMargins(0, 0, 16, 16) // некоторый отступ
        .create();
    

    这是最好和最方便的选择之一,不幸的是,这就是为什么有这么多代码的原因。


    要使您在上一个屏幕截图中用紫色框圈出问题的按钮,您需要将以下代码添加到 Activity 的 XML 布局中:

    <LinearLayout
        android:id="@+id/i1_LinearLayout_myButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/моя_большая_картинка" />
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/моя_маленькая_картинка"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true" />
    
        </RelativeLayout>
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="18pt"
                android:textColor="#000000"
                android:text="*1,560" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="**********" />
    
        </LinearLayout>
    
    </LinearLayout>
    

    并将此代码添加到onCreate()您的 Activity 方法中:

    LinearLayout i3 = (LinearLayout) findViewById(R.id.i1_LinearLayout_myButton);
    i3.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View i1) {
            startActivity(...); // и тут код запуска новой Activity
            return;
        }
    
    });
    
    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5