Статьи

Android SDK: контекстные меню

Узнайте о контекстных меню и длительном взаимодействии с пользователем на Android в этом быстром совете по Android SDK!

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


Если у вас есть приложение, с которым вы хотите реализовать контекстное меню, откройте класс Activity, в который вы хотите добавить его. В противном случае создайте новый проект и добавьте в него класс Activity. Исходный код включает в себя всю необходимую обработку, поэтому, если вы не уверены, обратитесь к этому. Если вы создаете новую активность в своем приложении, не забудьте добавить ее в свой файл манифеста следующим образом:

1
<activity android:name=».MyLovelyClass»></activity>

Измените имя в соответствии с вашим собственным классом.


Добавьте операторы импорта, необходимые для обработки контекстного меню. Возможно, вам не понадобятся все эти импортированные ресурсы, в зависимости от того, как вы решите реализовать контекстное меню, и ваша IDE может добавить некоторые из них автоматически. Чтобы использовать технику, продемонстрированную в этом руководстве, вашему классу Activity потребуется следующий импорт:

1
2
3
4
5
6
7
8
9
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.TextView;
import android.widget.Toast;

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

01
02
03
04
05
06
07
08
09
10
11
<LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    android:layout_width=»fill_parent»
    android:layout_height=»fill_parent»
    android:orientation=»vertical»
    android:gravity=»center» >
<TextView android:id=»@+id/press»
    android:layout_width=»wrap_content»
    android:layout_height=»wrap_content»
    android:textSize=»30sp»
    android:text=»Long-press me» />
</LinearLayout>

Вы можете указать своему классу Activity использовать этот макет следующим образом:

1
2
3
4
5
6
public class MyLovelyClass extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lovely_layout);
    }
}

Измените имя в соответствии с вашим собственным классом. В этом случае файл макета XML сохраняется как «lovely_layout.xml» в папке «res / layout» приложения.

Экран действий с интерактивным элементом просмотра

Если в вашем пакете приложения нет папки «menu» внутри директории ресурсов «res», создайте ее. Внутри папки меню создайте новый XML-файл для вашего меню и сохраните его с именем по вашему выбору. В этом файле вы определяете элементы, которые будут отображаться в контекстном меню. Вы можете использовать следующий код:

1
2
3
4
5
6
<menu xmlns:android=»http://schemas.android.com/apk/res/android»>
    <item android:id=»@+id/option1″
    android:title=»A Context Option» />
    <item android:id=»@+id/option2″
    android:title=»Another Context Option» />
</menu>

Измените элементы в соответствии с вашим собственным приложением и добавьте больше, если вам нужно.


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

1
2
3
4
    //get a reference to the view for pressing
TextView pressView = (TextView)findViewById(R.id.press);
    //register if for context
registerForContextMenu(pressView);

Укажите атрибут ID, который вы использовали для своего собственного элемента представления в файле макета XML, где в этом примере используется «нажатие». Это указывает вашему приложению обнаруживать пользователей, длительно нажимающих на указанный элемент просмотра. Когда это происходит, приложение вызывает метод «onCreateContextMenu», в котором вы можете указать ему использовать ресурс контекстного меню.


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

1
2
3
4
5
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.lovely_context, menu);
}

При необходимости измените это, чтобы отразить имя файла, которое вы выбрали для своего XML-файла контекстного меню. В этом примере для демонстрации используется файл меню с именем «lovely_context.xml».

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
public boolean onContextItemSelected(MenuItem item) {
        //find out which menu item was pressed
    switch (item.getItemId()) {
        case R.id.option1:
            doOptionOne();
            return true;
        case R.id.option2:
            doOptionTwo();
            return true;
        default:
            return false;
    }
}

Измените операторы case, чтобы они отражали атрибуты идентификатора, которые вы дали своим элементам меню в файле XML. Оператор switch использует переданный параметр пункта меню, чтобы проверить, какую опцию меню выбрал пользователь. Вы можете включить дополнительную инструкцию case для каждой опции в своем контекстном меню, если вы добавили больше самостоятельно. Внутри каждого оператора код указывает метод, который вызывается, когда пользователь выбирает этот элемент. Теперь вам нужно реализовать методы, указанные в этом операторе.

Выбор элемента из контекстного меню

Определение выделенных методов для каждого параметра контекстного меню обеспечивает хорошую организацию вашего класса Activity, поэтому добавьте каждый из них, включенный в оператор switch. Следующие примеры методов демонстрируют принцип:

1
2
3
4
5
6
7
8
9
//method to execute when option one is chosen
private void doOptionOne() {
    Toast.makeText(this, «Option One Chosen…», Toast.LENGTH_LONG).show();
}
 
//method to execute when option two is chosen
private void doOptionTwo() {
    Toast.makeText(this, «Option Two Chosen…», Toast.LENGTH_LONG).show();
}

Эти методы просто пишут короткое сообщение в интерфейс для демонстрации. В ваших собственных классах вы можете реализовать любую необходимую вам обработку.

Результат выбора пункта контекстного меню

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

1
import android.app.Activity;

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


Я веб-разработчик / разработчик программного обеспечения и технический / комедийный писатель — подробности смотрите в BeNormal.info . Приложения Nonsense — моя первая попытка разработки под Android. Я написал для многих разных клиентов, включая Smashing Magazine . Мои собственные сайты включают в себя журнал об обмане BrainDeadAir . Следуйте за мной в Twitter @BrainDeadAir или пишите мне на [email protected] .