ActionBarSherlock с несколькими элементами меню? - PullRequest
3 голосов
/ 19 марта 2012

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

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

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

Я смотрел на предложения @ Олли, но ни 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>

Ответы [ 2 ]

7 голосов
/ 19 марта 2012

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

@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);
    }
}

EDIT : Наконец, вы должны сделать по-другомувещи для каждого элемента, если вы измените целевую активность намерения на другую, она будет делать то, что вы ожидаете:

@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);
    }
}
3 голосов
/ 15 мая 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.Я предполагаю (и это только предположение) Android в этом случае назначает один и тот же идентификатор для всех элементов, например, ноль или другое произвольное число.Вы должны использовать метод с подписью add(int, int, int,CharSequence) или add(int, int, int, int), поскольку только те, которые позволяют вам указать ItemId.Итак, оба ваших пункта меню имеют одинаковый идентификатор.И это (я думаю еще раз) причина того, что они ведут себя одинаково.Еще кое-что.Будьте осторожны, чтобы использовать правильные замещающие классы и методы из библиотеки поддержки и библиотеки ActionBarSherlock.Пожалуйста, дайте нам знать, если это решило проблему, так как я только запускаю это в своей голове.

...