How to add two or more menus to one activity in Android programming?

Suppose we want to add the top menu (three vertical dots with a header with the name of the application), which is not difficult even for beginners, and the menu looks the same as in the Navigation Drawer Activity , but not retractable, but static, always displayed (roughly mounted image final result):

enter image description here

  • If you have another menu in onCreateOptionsMenu , then you just get one menu with elements from both:

     @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options_menu, menu); getMenuInflater().inflate(R.menu.main_menu, menu); return true; } 
  • Two methods onCreateOptionsMenu(Menu menu) cannot naturally be.


Update: this is about what I want to do (do not pay attention to the language; any "fish" is suitable for the answer, even though the traditional lorem ipsum). Red is the top drop-down menu, and you can click on any of the fields that I marked in purple, and it will transfer to another activity. Almost a set of buttons, only each button has a large icon, a small icon and two labels.

enter image description here

  • 2
    There are lots of ways to solve your problem, you can just make submenu, you can make an icon next to the menu when you click it, PopUp will be called. You can add another ToolBar and inflate it with another menu, there will also be two menus, well, or how much you need, you specify what you need. - Shwarz Andrei
  • I clarify. I figured out the top menu; you can not touch it. The second menu is essentially the most common settings screen. How to implement it does not really matter, the main thing is that it can be programmed as easily as the top menu. I looked at the template with the settings screen - I could probably use it, but I would like less code than in that template. - Hokov Gleb
  • @GurebuBokofu, well, I think you should get a solution through NavigationView, which is done by NavigationDrawer - Juriy Spb ♦
  • Today I studied the code of this template for a long time, but for the time being I don’t understand how to change the onCreate () method code so that instead of the pull-down menu there is a static menu (similar to the settings screen) - Gleb Side
  • @GurebuBokofu and why just do not impose a regular screen, such as you have in the picture without NavigationDrawer if you do not need to be able to snap it? - Kirill Stoianov

1 answer 1

In the Activity more than one menu can not be done. I can offer you a slightly different option.

Create two buttons in ActionBar. I1.xml file

 <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> 

This is how it will look like in the end:

one

These buttons will act as a menu button. Here is the Activity code. I1.java file

 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); } } 

Clicking on them opens an AlertDialog sheet with items. The user simply selects the item he needs.

2

3


In order to make a round floating button at the bottom of the Activity, as in the picture

four

you need to create a new class called FloatingActionButton , paste this code into it:

 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) ; } } } 

and then insert this code into the onCreate() method of your 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(); 

This is one of the best and convenient options, so, unfortunately, there is so much code.


To make the button that you circled in your question on the last screenshot with a purple frame, you need to add the following code in the XML Layout of your Activity:

 <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> 

and this code into the onCreate() method of your Activity:

 LinearLayout i3 = (LinearLayout) findViewById(R.id.i1_LinearLayout_myButton); i3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View i1) { startActivity(...); // ΠΈ Ρ‚ΡƒΡ‚ ΠΊΠΎΠ΄ запуска Π½ΠΎΠ²ΠΎΠΉ Activity return; } }); 
  • Thank you for your time! I will give the prize about a day before the competition closes. Tell the newbie, how then is the settings screen implemented in the Android Studio template? As I have seen, there is also a top menu, but the main screen also serves as a menu. I added an example application to the question, where is the main and top menu. - Bokov Gleb
  • @GurebuBokofu, I use Eclipse Android instead of Android Studio. I didn’t quite understand what was wrong with you. Not visible that blue round button at the bottom of the Activity? - nick
  • Not. In general, I added to the question what I want to do in the end. I currently do not have enough knowledge to make a set of button-fields, one of which I marked purple. - Sideways Gleb
  • @GurebuBokofu, I'll be free in an hour - I'll write. Too much code will work. - nick
  • one
    Great, thank you for the code! As promised, I give you a prize of 50 reputation! - Side Gleb