Меню опций Android не работает

Как говорится в вопросе, он не работает. При нажатии на кнопку меню ничего не выходит.

Это меню Активность:

public class AndroidMenuActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewphoto);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub
     super.onCreateOptionsMenu(menu); 
     MenuInflater menuInflater = getMenuInflater();
     menuInflater.inflate(R.menu.menu, menu);
     return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch(item.getItemId()){
        case R.id.edit:
            Toast.makeText(getApplicationContext(), "edit selected", Toast.LENGTH_SHORT).show();
            Intent i = new Intent(getApplicationContext(), PhotoFlashActivity.class);
            startActivity(i);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
}

и очень маленькое меню.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/edit"
    android:title="Edit"/>   

</menu>

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


person consprice    schedule 10.08.2012    source источник
comment
Привет, @consprice. Я просто добавил коды, связанные с меню, и файл menu.xml в свою активность, и я обнаружил, что это работает. Может быть, что-то еще не так.   -  person Huang    schedule 10.08.2012
comment
@Huang Я попытался удалить действие, создав новое с точными кодами, но это тоже не работает. Небольшой вопрос, нужно ли добавлять активность в файл манифеста? И если возможно, что еще могло быть причиной этого. Я использую API уровня 8, если это помогает.   -  person consprice    schedule 10.08.2012
comment
Вы должны объявить все свои действия в файле манифеста, иначе система выдаст ошибку при попытке запустить действие, потому что система не может его найти. Я только что создал совершенно новый проект с API 7 и скопировал все коды, связанные с процессом меню, и это сработало...   -  person Huang    schedule 10.08.2012
comment
@Huang Я сделал это, но это не работает ... Спасибо за помощь :)   -  person consprice    schedule 10.08.2012
comment
Вы переопределяете onKeyDown() или аналогичные методы, чтобы сообщение клавиши меню было перехвачено? В таких случаях клавиша меню не будет работать, так как она отключена.   -  person Huang    schedule 10.08.2012
comment
@Huang У меня нет onKeyDown() или подобных методов. Единственные методы, которые у меня есть, находятся в вопросе.   -  person consprice    schedule 10.08.2012
comment
давайте продолжим это обсуждение в чате   -  person Huang    schedule 10.08.2012
comment
У меня была такая же проблема. Как предложил Хуанг, я переопределял onkeydown(), и это создавало проблемы.   -  person ambit    schedule 02.11.2013


Ответы (4)


Это может быть ничего, но что произойдет, если вы перепишете свой onCreateOptionsMenu(...) так, чтобы он выглядел так:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // TODO Auto-generated method stub

     MenuInflater menuInflater = getMenuInflater();
     menuInflater.inflate(R.menu.menu, menu);
     return super.onCreateOptionsMenu(menu); 
}
person Nick    schedule 10.08.2012
comment
Как насчет того, чтобы полностью закомментировать вызов super.OnCreateOptionsMenu(...) ? Я вижу, что в некоторых старых приложениях, которые я написал (меню опций устарело и было заменено ActionBar), я никогда не вызывал этот метод. - person Nick; 10.08.2012
comment
это тоже не работает, на самом деле изначально у меня вообще не было super.onCreateOptionsMenu(). Добавил его после просмотра этой ссылки coderanch.com/t/502429/Android/Mobile /Меню - person consprice; 10.08.2012
comment
Еще один глупый вопрос... какие у вас установлены minSdkLevel и targetSdkLevel? Также на какой версии ОС Android вы тестируете? Наконец, видите ли вы кнопку переполнения в своем приложении? (выглядит как 3 точки, расположенные вертикально друг над другом.) Если да, то видите ли вы пункты меню под ним, если щелкнуть по нему? - person Nick; 10.08.2012
comment
Что ты хочешь знать? про уровень super или sdk - person Narendra Pal; 10.08.2012
comment
@nick (тот, что в нижнем регистре n) Причина, по которой я спрашиваю, заключается в том, что при определенных условиях на некоторых устройствах меню параметров автоматически переносится в дополнительное меню. - person Nick; 10.08.2012
comment
@Nick для первого вопроса: android:minSdkVersion="7" android:targetSdkVersion="14" для второго, я не вижу кнопку переполнения в приложении, а если быть точнее, то вообще ничего не появляется, когда я нажимаю кнопку меню, вообще ничего не появляется - person consprice; 10.08.2012
comment
На какой версии ОС Android вы тестируете? - person Nick; 10.08.2012
comment
Я попробую то, что у вас есть на эмуляторе froyo, и вернусь к вам. Если вы хотите опубликовать свой AndroidManifest.xml, это сделает его быстрее, но в любом случае не беспокойтесь. - person Nick; 10.08.2012
comment
Подтвердил, что то, что вы разместили, работает. Думаю, можно с уверенностью сказать, что проблема не в AndroidMenuActivity и не в menu.xml. Мне все еще было бы интересно увидеть AndroidManifest.xml... - person Nick; 10.08.2012
comment
@Ник, это проблема с файлом манифеста. После обсуждения с Хуангом ошибка заключалась в том, что я поместил лаунчер в активность viewphoto.xml вместо активности menu.xml. Однако большое спасибо за помощь :) Может быть, вы хотите изменить ответ на этот вопрос, поскольку он отказался разместить свой ответ? - person consprice; 10.08.2012

Попробуйте этот код, он works для меня идеален.

основной класс

public class OptionmenuActivity extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {


    MenuInflater inflater=getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    //return super.onCreateOptionsMenu(menu);

    menu.add("hello").setIcon(R.drawable.ic_launcher);
    menu.add("patel").setIcon(R.drawable.ic_launcher);
    menu.add("abc").setIcon(R.drawable.ic_launcher);
    menu.add("hello").setIcon(R.drawable.ic_launcher);
    menu.add("").setIcon(R.drawable.ic_launcher);
    menu.add("").setIcon(R.drawable.ic_launcher);

    return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId())
    {
    case R.id.feeds:
        Toast msg = Toast.makeText(OptionmenuActivity.this, "feeds", Toast.LENGTH_LONG);
        msg.show();
        return true;

    case R.id.friends:
        Toast msg1 = Toast.makeText(OptionmenuActivity.this, "friends", Toast.LENGTH_LONG);
        msg1.show();
        return true;
    case R.id.about:
        Toast msg2 = Toast.makeText(OptionmenuActivity.this, "about", Toast.LENGTH_LONG);
        msg2.show();
        return true;

    case 2:

         Toast msg3 = Toast.makeText(OptionmenuActivity.this, "Menu 1", Toast.LENGTH_LONG);
            msg3.show();
            return true;

    }
    return true;
}
}

создайте папку menu в папке res после создания папки menu.xml внутри папки menu.

меню.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/feeds"
    android:title="Feeds"
    android:icon="@drawable/ic_launcher"/>

<item
    android:id="@+id/friends"
    android:title="Friends"/>

<item
    android:id="@+id/about"
    android:title="About"/>

person Rahul Patel    schedule 10.08.2012

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);        
        menuInflater.inflate(R.menu.menu, menu);
        menu.findItem(R.id.edit).setTitle("Edit");
}

Вы также можете попробовать принудительно:

menu.findItem(R.id.edit).setVisible(true);

тогда...

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case R.id.edit:
            //DO SOMETHING
            return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

ИЛИ.... Вы можете создать меню на java:

private static final int MENU_EDIT = 1;    
MenuItem itemconfig = menu.add(0, MENU_EDIT , 0, "Edit");
            itemconfig.setIcon(android.R.drawable.ic_menu_edit);
            itemconfig.setShowAsAction(2);

и onOptionsItemSelected:

case: MENU_EDIT
     //DO SOMETHING
     return true;
person user3209953    schedule 28.01.2014

измените свой код следующим образом и проверьте.

     @Override
 public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
 super.onCreateOptionsMenu(menu); 
 MenuInflater menuInflater = getMenuInflater();
 menuInflater.inflate(R.menu.menu, menu);
 return true;
}

 public boolean onContextItemSelected(MenuItem item) {       
    onOptionsItemSelected(item);
    return true;
}

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 // TODO Auto-generated method stub
  switch(item.getItemId()){
    case R.id.edit:
        Toast.makeText(getApplicationContext(), "edit selected", Toast.LENGTH_SHORT).show();
        Intent i = new Intent(getApplicationContext(), PhotoFlashActivity.class);
        startActivity(i);
        return true;
        default:
         return super.onOptionsItemSelected(item);
   }
 }
}
person NagarjunaReddy    schedule 10.08.2012