Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Два и более меню в одной activity

#android


Как добавить два и более меню в одну activity в программировании под 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). Красным обозначено верхнее
выпадающее меню, а на любое из полей, которое я обозначил фиолетовым, можно нажимать
и оно перебросит на другую активность. Почти набор кнопок, только каждая кнопка имеет
большую иконку, маленькую иконку и две надписи. 


    


Ответы

Ответ 1



В Activity более одного меню сделать нельзя. Я могу предложить Вам немного другой вариант. Создаём две кнопки в ActionBar. Файл i1.xml Вот так это будет выглядеть в итоге: Эти кнопки будут выступать в роли кнопки меню. Вот код Activity. Файл 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 с пунктами. Пользователь просто выбирает нужный ему пункт. Для того, чтобы сделать круглую плавающую кнопку внизу 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(); Это один из лучших и удобных вариантов, поэтому, к сожалению, так много кода. Чтобы сделать кнопку, которую Вы обвели в своём вопросе на последнем скриншоте фиолетовой рамкой, нужно дописать следующий код в XML Layout твоего Activity: и этот код в метод 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; } });

Комментариев нет:

Отправить комментарий