Статьи

Создание меню в Android с использованием Java и XML: контекстные и всплывающие меню

В предыдущей статье этой серии мы узнали, как создавать стандартные меню опций для вашего Android-приложения, используя XML или создавая его непосредственно через Java-программирование. Помимо этих типовых меню параметров, разработчики Android также могут создавать специализированные типы меню, такие как контекстное меню и всплывающее меню в своих приложениях для Android.

Контекстное меню — это меню, которое влияет (или появляется на) на определенные элементы и обычно имеет параметры, которые влияют только на этот конкретный элемент. Контекстное меню в Android появляется, когда пользователь нажимает и удерживает определенный элемент. Контекстное меню будет представлено пользователю, и он или она сможет выбирать из множества опций.

Android также позволяет создавать всплывающие меню в вашем приложении. Всплывающее меню — это модальное меню, которое можно запрограммировать на отображение при нажатии кнопки.

В этой статье мы собираемся продемонстрировать, как мы можем создавать контекстные и всплывающие меню в наших приложениях для Android.

Регистрация представления для контекстных меню

Для начала, мы собираемся построить базовый пример, создав контекстное меню для одного элемента. В представлении создается контекстное меню, поэтому мы сначала зарегистрируем это представление для контекстного меню, а затем перейдем к самому меню.

Но давайте сначала создадим активность Android в файле layout.xml следующим образом:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

>

<TextView

android:id="@+id/<span style="text-decoration: underline;">Username</span>"

android:layout_width="fill_parent"

android:layout_height="60dip"

android:text="Hold For contextual menu"

android:padding="4dip"

/>

<EditText

android:id="@+id/usernameEdittext"

android:layout_height="wrap_content"

android:singleLine="true"

android:background="#<span style="text-decoration: underline;">ffffff</span>"

android:layout_width="400dip" >

</EditText>

</LinearLayout>

В приведенном выше макете мы только что создали один TextView и один вид редактирования внутри макета. Теперь мы напишем код для действия следующим образом:

[sourcecode language = ”java”]

пакет com.contexualandpopupmenudemon;

импорт android.os.Bundle;

импорт android.app.Activity;

импорт android.view.Menu;

import android.widget.EditText;

открытый класс ContextualAndPopupmenuDemo extends Activity {

@Override

protected void onCreate (BundlevedInstanceState) {

super.onCreate (savedInstanceState);

setContentView (R.layout.main);

EditText UserNameEditText = (EditText) findViewById (R.id.usernameEdittext);

registerForContextMenu (UserNameEditText);

}

}

[/исходный код]

В приведенном выше действии мы переопределили метод onCreate, в котором мы установили основной макет. Затем мы находим EditText, используя функцию findViewById.

Как только мы получим EditView, мы вызываем registerForContextMenu для этого представления. Эта функция регистрирует вид и позволяет отображать контекстное меню.

Создание контекстного меню

Как только мы зарегистрировали представление для контекстного меню, мы создадим меню в XML для нашего контекстного меню. Чтобы создать меню в формате XML, создайте файл contextual.xml в папке меню ваших ресурсов. Добавьте следующий код в ваш файл contextual.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/fetch"

android:title="Fetch New <span style="text-decoration: underline;">Username</span>" />

<item android:id="@+id/check"

android:title="Check For Duplicate" />

</menu>

В нашем контекстном меню мы создали два элемента: один для получения имен пользователей и один для проверки на наличие дубликатов. После того, как мы создали меню в формате XML, нам придется переопределить функцию onCreateContextMenu следующим образом:

[sourcecode language = ”java”]

@Override

public void onCreateContextMenu (контекстное меню, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu (menu, v, menuInfo);

if (v.getId () == R.id.usernameEdittext) {

getMenuInflater (). inflate (R.menu.contextual, menu);

}

}

[/исходный код]

В этом коде мы определяем, является ли идентификатор представления конкретным, который мы ищем. Если это так, мы запускаем меню, как описано в предыдущей статье этой серии .

Теперь, если вы удерживаете несколько секунд на EditText, вы должны увидеть следующее контекстное меню:

image001

Если вы не хотите создавать это меню в XML, вы можете создать идентичное меню в Java с помощью следующего программирования:

[sourcecode language = ”java”]

@Override

public void onCreateContextMenu (контекстное меню, View v,

ContextMenuInfo menuInfo) {

super.onCreateContextMenu (menu, v, menuInfo);

if (v.getId () == R.id.usernameEdittext) {

menu.add (0, 1, 0, «Выбрать новое имя пользователя»);

menu.add (0, 2, 0, «Проверить наличие дубликатов»);

}

}

[/исходный код]

Теперь, если вы снова запустите приложение, вы увидите меню, очень похожее на то, что мы создали с помощью форматирования XML.

Реагирование на клики по контекстным меню

Чтобы отвечать на выбор пользователя в наших контекстных меню, мы должны реализовать функцию onContextItemSelected в нашей деятельности. Чтобы ответить на наши пункты меню, мы реализуем onContextItemSelected, как показано ниже:

[sourcecode language = ”java”]

@Override

public boolean onContextItemSelected (элемент MenuItem) {

switch (item.getItemId ()) {

case R.id.fetch:

showToast («Выбрать нажатием»);

вернуть истину;

case R.id.check:

showToast («Проверить нажали»);

вернуть истину;

дефолт:

return super.onContextItemSelected (item);

}

}

public void showToast (Строковое сообщение) {

Toast toast = Toast.makeText (getApplicationContext (), сообщение, Toast.LENGTH_SHORT);

toast.show ();

}

[/исходный код]

В приведенном выше программировании выбранный пункт меню передается функции onContextItemSelected, и мы можем вызвать getItemId, чтобы определить, какой элемент меню был нажат. Затем мы вызываем соответствующую функцию (которая соответствует выбору пользователя) для обработки этого щелчка меню. В настоящее время единственная функциональность, которая возникает в результате выбора пункта меню, — это тост с сообщением. Итак, теперь, если вы нажмете «Получить новое имя пользователя», вы должны увидеть следующее:

image003

Создание всплывающего меню

Всплывающее меню (поддерживается только после уровня API Android 11) — это модальное меню, которое вы можете создавать и отображать рядом с видом. В демонстрационных целях мы создадим всплывающее меню при нажатии кнопки «Параметры» в действии. Сначала добавим эту кнопку «Параметры» в наш файл layout.xml, как показано ниже.

 <Button

android:id="@+id/<span style="text-decoration: underline;">btnoptions</span>"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Options"

android:onClick="CreatePopupMenu"/>

Это создаст необходимую кнопку «Опции» для нашего всплывающего меню. Когда выбрано, будет вызвана функция CreatePopupMenu. Затем мы создаем новый файл popup.xml в нашей папке res / menu со следующим содержимым:

 <menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/option1"

android:title="Option 1" />

<item android:id="@+id/option2"

android:title="Option 2" />

</menu>

В нашем файле popup.xml выше мы создали два пункта меню: option1 и option2. Затем мы добавляем функцию CreatePopupMenu в нашу деятельность, используя следующее программирование:

[sourcecode language = ”java”]

public void CreatePopupMenu (View v) {

PopupMenu mypopupmenu = new PopupMenu (это, v);

MenuInflater inflater = mypopupmenu.getMenuInflater ();

inflater.inflate (R.menu. <i> popup </ i>, mypopupmenu.getMenu ());

mypopupmenu.show ();

}

[/исходный код]

Выше мы создаем новый объект PopupMenu и затем включаем в него наше меню popup.xml. Затем мы показываем всплывающее меню, вызывая функцию show .

Итак, теперь, если мы запустим приложение и нажмем нашу новую кнопку «Опции», вы сможете увидеть меню, показанное ниже.

image005

Ответ на щелчки всплывающего меню

Чтобы реагировать на нажатия всплывающих меню, необходимо установить прослушиватель щелчков пункта меню, который является классом, реализующим интерфейс OnMenuItemClickListener. У него есть один метод — onMenuItemClick. Мы внедрим этот интерфейс в нашу деятельность. Итак, мы должны изменить определение класса следующим образом:

[sourcecode language = ”java”]

открытый класс ContextualAndPopupmenuDemo расширяет Activity, реализует OnMenuItemClickListener {

Затем мы меняем CreatePopupMenu и реализуем onMenuItemClick следующим образом

public void CreatePopupMenu (View v) {

PopupMenu mypopupmenu = new PopupMenu (это, v);

mypopupmenu.setOnMenuItemClickListener (это);

MenuInflater inflater = mypopupmenu.getMenuInflater ();

inflater.inflate (R.menu.popup, mypopupmenu.getMenu ());

mypopupmenu.show ();

}

@Override

public boolean onMenuItemClick (MenuItem arg0) {

switch (arg0.getItemId ()) {

case R.id.option1:

showToast («Option1 нажал»);

вернуть истину;

case R.id.option2:

showToast («Option2 нажал»);

вернуть истину;

дефолт:

return super.onContextItemSelected (arg0);

}

}

[/исходный код]

В функции onMenuItemClick — в зависимости от выбранного пункта меню — отобразит соответствующий тост. Если мы нажмем на один из пунктов меню, мы увидим тост, показанный ниже.

image008

Вывод

В Android вы можете создавать разнообразные меню для различных настроек и обстоятельств. Вы можете определить эти меню в файле XML, или вы можете добавить их непосредственно через код Java. Вы можете отвечать на пункты меню в зависимости от типа меню (контекстное, всплывающее), которое вы создали. Когда вы предлагаете настройки для всего приложения, вы обычно должны использовать меню «Опции». Если вы хотите предложить специальные параметры или настройки для определенного элемента, то вам, вероятно, следует использовать контекстное меню.

Чтобы появилось контекстное меню, пользователь должен некоторое время удерживать нужную опцию. Если вы хотите отобразить меню для какого-либо другого пользовательского действия, такого как нажатие кнопки или нажатие на изображение, вы также можете использовать всплывающее меню для этой цели. Независимо от идеи вашего приложения или имеющейся у вас функциональности, теперь у вас есть инструменты, необходимые для захвата пользовательского ввода и создания разумного, интуитивно понятного приложения. Получайте удовольствие от реализации этих различных типов меню в вашем следующем приложении для Android.