ActionBarSherlock с несколькими элементами меню?

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

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

РЕДАКТИРОВАТЬ:

Я просматривал предложения @Ollie, но ни LogCat, ни Debug не показывают странных вещей. Может быть, дело в какой-то другой части кода или в объявлении для ABS? Вот весь код, если бы вы могли его просмотреть, было бы здорово!

Код для всего действия, может быть, в каком-то другом месте?

package bas.sie.Antonius;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class TeacherInfo extends SherlockActivity {

    String URLhome;
    String Info;
    String TeacherAb;
    TextView mTxtvInfo;
    Button mBtnTeacherStSchedule;
    Button mBtnTeacherDaySchedule;
    private static String mainUrl = "http://www.carmelcollegegouda.nl/site_ant/";
    private static String endUrl = ".htm";
    private static String[] myUrls = { "roosters/dagroosters/Doc_V1_",
            "roosters/standaardroosters/Doc1_" };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contactinfo);
        setTitle("Over deze leraar");

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        mTxtvInfo = (TextView) findViewById(R.id.TxtvTeacher);

        Intent startingIntent = getIntent();
        Info = startingIntent.getStringExtra("contact");
        mTxtvInfo.setText(Info);

        Intent startingIntent1 = getIntent();
        TeacherAb = startingIntent1.getStringExtra("abbrev");

        mBtnTeacherDaySchedule = (Button) findViewById(R.id.btnTeacherDaySchedule);
        mBtnTeacherStSchedule = (Button) findViewById(R.id.btnTeacherStSchedule);

        mBtnTeacherDaySchedule.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                URLhome = makeUrl(0);

                Intent i = new Intent(TeacherInfo.this, MyWebView.class);
                i.putExtra("home", URLhome);
                startActivityForResult(i, 0);
            }
        });

        mBtnTeacherStSchedule.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                URLhome = makeUrl(1);

                Intent i = new Intent(TeacherInfo.this, MyWebView.class);
                i.putExtra("home", URLhome);
                startActivityForResult(i, 0);
            }
        });

    }

    private String makeUrl(int index) {
        String s = mainUrl + myUrls[index] + TeacherAb + endUrl;
        return s;
    }// makeurl

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Instellingen")
                .setIcon(R.drawable.ic_settings)
                .setShowAsAction(
                        MenuItem.SHOW_AS_ACTION_IF_ROOM
                                | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        menu.add("Over de app")
                .setIcon(R.drawable.ic_about)
                .setShowAsAction(
                        MenuItem.SHOW_AS_ACTION_IF_ROOM
                                | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = new Intent(this, AntoniusActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        case R.id.settings:
            Intent i = new Intent(this, About.class);
            startActivity(i);
            return true;
        case R.id.about:
            Intent about = new Intent(this, About.class);
            startActivity(about);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

}

Я думаю, что проблема в объявлении пунктов меню, но я не вижу там никакой проблемы...

Не могли бы вы взглянуть на мой menu.xml? Опубликовано здесь:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/settings" 
          android:icon="@drawable/ic_settings" 
          android:title="Instellingen"></item>
    <item android:id="@+id/about" 
          android:icon="@drawable/ic_about" 
          android:title="Over de app"></item>
</menu>

person DatBassie    schedule 19.03.2012    source источник
comment
Вы делаете одно и то же для обоих случаев. Измените операторы в соответствующем случае: оператора switch.   -  person RaphMclee    schedule 08.08.2012


Ответы (2)


Создайте меню следующим образом:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}

Затем используйте оператор switch для обработки выбора:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // Do stuff
            return true;
        case R.id.menu_item_2:
            // Do stuff
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

РЕДАКТИРОВАТЬ: Наконец, вы должны делать разные вещи для каждого элемента, если вы измените целевое действие намерения на другое, оно будет делать то, что вы ожидаете:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        // ... Stuff ...
    case R.id.settings: // Settings item
        Intent i = new Intent(this, About.class); // Start About.java Activity, but item says "settings"
        // TODO: Change About to Settings?
        i = new Intent(this, Settings.class);
        startActivity(i);
        return true;

    case R.id.about: // About item
        Intent about = new Intent(this, About.class); // Start About.java Activty
        startActivity(about);
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}
person Ollie C    schedule 19.03.2012
comment
Это тоже пробовал, но это не сработало... Я попробую еще раз, какие-нибудь рекомендации о том, как начать активность здесь? Я использовал startActivityForResult(i, 0) и просто startActivity(i). - person DatBassie; 19.03.2012
comment
Определить не получится. Приведенный выше код вставлен из работающего приложения, поэтому я точно знаю, что этот код работает. - person Ollie C; 19.03.2012
comment
Это покажет, что я щелкнул по нему (синий значок), но не запустит действие, которое обозначают значки. С другой стороны, это работало для кнопки «Домой». - person DatBassie; 19.03.2012
comment
Я предлагаю добавить в код подробное журналирование, чтобы точно видеть, по какому пути он следует, или использовать отладчик, чтобы сделать то же самое. Также убедитесь, что ваше меню создается правильно, так как если оно было создано неправильно, пункты меню не будут работать. - person Ollie C; 20.03.2012
comment
Ваш код довольно запутан. У вас есть файл menu.xml для определения ваших меню, но ваш код полностью его игнорирует, и вы добавляете их вручную. Я предлагаю вам привести код в порядок и сначала отсортировать подобные вещи, это значительно облегчит поиск причины. - person Ollie C; 20.03.2012
comment
Да, я так и думал... Есть предложения, что лучше? Из XML или из кода действия? - person DatBassie; 20.03.2012
comment
У обоих есть свое применение. Я предпочитаю ресурсы, поскольку они упрощают внесение изменений — мне кажется более интуитивным редактировать определения меню в XML. Но выберите один. Держите свой код простым, или вы попадете в ад. - person Ollie C; 20.03.2012
comment
Спасибо за всю помощь и советы! Кредиты вам добавлены ;). @Xavi Rigau Спасибо за добавление решения. Я предполагаю, что все различные исходные коды и инструкции от разработчиков ABS и Android стали слишком сложными для обработки... - person DatBassie; 20.03.2012
comment
Кроме того, двойное сообщение о намерениях не было проблемой. Он работал в другом действии, используя эту настройку, с правильными именами: P. - person DatBassie; 20.03.2012

Что мне кажется странным, так это то, как вы составляете свое меню. Вы определили макет меню в файле menu.xml, но не ссылаетесь на этот макет в методе onCreateOptionMenu(). Это должно быть что-то вроде этого:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}

Обратите внимание на метод getSupportMenuInflater(), который используется вместо getMenuInflater(). Почему это должно быть так, где-то в документации о библиотеке поддержки Android, которая в терминах используется библиотекой ActionBarSherlock.

Что вы делаете, так это программно создаете меню в коде, используя метод menu.add() с сигнатурой add(CharSequence). Нигде вы не указываете ItemId. Я предполагаю (и это только предположение), что андроид в этом случае присваивает всем элементам один и тот же идентификатор, что-то вроде нуля или другого произвольного числа. Вы должны использовать метод с сигнатурой add(int, int, int,CharSequence) или add(int, int, int, int), так как только они позволяют указать ItemId. Итак, оба ваших пункта меню имеют одинаковый идентификатор. И это (я думаю, снова) причина того, что они ведут себя одинаково. Еще кое-что. Будьте осторожны, чтобы использовать правильные замещающие классы и методы из библиотеки поддержки и библиотеки ActionBarSherlock. Пожалуйста, дайте нам знать, если это решило проблему, поскольку я запускаю это только в своей голове.

person Anderson    schedule 15.05.2012
comment
Что ты предлагаешь? Он работает правильно, или так кажется... Хотя я должен сказать, что сейчас работаю над чем-то другим, поэтому я не могу показать вам код, который я думаю... - person DatBassie; 15.05.2012
comment
@bassie1995 Bassie1995 Я отредактировал ответ, включив в него то, что я считаю возможным решением. - person Anderson; 15.05.2012