Как вызвать Activity из пункта меню в Android?

Я пытаюсь вызвать startActivity (myIntent) с помощью нажатия кнопки меню, но мое приложение сработает в этот момент.

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

Итак... какой правильный способ иметь пункт меню принять меня к определенной деятельности?

Я пересмотрел свой код на основе первоначального набора советов. Все еще рушится в одном и том же месте. Отладчик не вводит условие исключения, приложение просто умирает.

[СОЕДИНЕН С СНИПЕТОМ КОДА]

public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.menu, menu);
  return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
   try{
    switch (item.getItemId()) {
    case R.id.menuItemLang:            
        startActivity(new Intent("com.my.project.SETTINGS"));
        return true;        
    default:
        return super.onOptionsItemSelected(item);
    }
   }catch(Exception e){
      log(e);
   }
}

Ответы

Ответ 1

Первая опция

Вы должны переопределить метод onOptionsItemSelected в своей деятельности, который вызывается, когда пользователь нажимает на элемент в меню "Параметры". В методе вы можете проверить, какой элемент был нажат.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case R.id.menu_item1:
        Intent intent = new Intent(this, ActivityForItemOne.class);
        this.startActivity(intent);
        break;
    case R.id.menu_item2:
        // another startActivity, this is for item with id "menu_item2"
        break;
    default:
        return super.onOptionsItemSelected(item);
    }

    return true;
}

Существует также метод onContextItemSelected, который работает аналогично, но для контекстного меню (я не уверен, какое меню вы имеете в виду).

Дополнительная информация на http://developer.android.com/guide/topics/ui/menus.html

EDIT:

Второй вариант

Я думаю, что первый вариант проще, но из вашего кода я вижу, что вы хотите запустить активность как действие (из-за параметра String в конструкторе Intent). Для этого вам нужно указать действие в вашем AndroidManifest.xml. Итак, если бы я начал работу ActivityForItemOne (из предыдущего примера), элемент <application> в AndroidManifest.xml выглядел бы так:

<application ...>
    ...

    <activity android:label="Activity For First Item" android:name=".ActivityForItemOne">
        <intent-filter>
            <action android:name="my.app.ITEMONE" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

И Intent будет:

Intent intent = new Intent("my.app.ITEMONE");

my.app. - это пакет вашего приложения. Нет необходимости использовать ваш пакет приложений, но он рекомендуется для уникальности действий.

Дополнительная информация:

Намерение класса - константы действий и категорий

Элемент действия

Намерения и фильтры намерений

Надеюсь, что это решит вашу проблему.

Ответ 2

Больше опций:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.item1:
            return true;
        case R.id.item2:
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Ответ 3

если есть 2 класса 1 MainActivity 2 Добро пожаловать то вам нужно перейти от Welcom > MainActivity

@Override   public boolean onCreateOptionsMenu (меню меню) {

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.logout:
            Intent intent = new Intent(this, MainActivity.class);
            this.startActivity(intent);
            break;
        case R.id.settings:
            // another startActivity, this is for item with id "menu_item2"
            break;
        default:
            return super.onOptionsItemSelected(item);
    }

    return true;
}