ActionBarSherlock有多个MenuItems?

时间:2012-03-19 17:22:18

标签: java android eclipse menuitem actionbarsherlock

我在我的一个应用程序中使用了带有两个MenuItem的ABS 4.0,但发现了一个小错误:当按下第二个MenuItem时,它与第一个完全相同...

我已经尝试了我能想到的一切,但它没有用。我改变了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>

2 个答案:

答案 0 :(得分:7)

创建如下菜单:

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

编辑:最后,你应该为每个项目做不同的事情,如果你将Intent目标活动改为另一个,它会做你期望的事情:

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

答案 1 :(得分:3)

我觉得奇怪的是你创建菜单的方式。 您已在menu.xml中定义了菜单布局,但未在onCreateOptionMenu()方法中引用此布局。 它应该是这样的:

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

注意使用getSupportMenuInflater()方法而不是getMenuInflater()。为什么必须如此,这是关于android支持库的docemntation中的某个地方,其中术语由ActionBarSherlock库使用。

您所做的是使用带有签名menu.add()的方法add(CharSequence)以编程方式在代码中创建菜单。无处在那里,你给ItemId。我想(这只是一个猜测)在这种情况下,android为所有项目分配相同的id,类似零或其他任意数字。您应该使用带有签名add(int, int, int,CharSequence)add(int, int, int, int)的方法,因为只有那些允许您指定ItemId的方法。因此,两个菜单项都具有相同的ID。这是(我再次猜测)它们表现相同的原因。 还有一件事。请注意,您使用支持库和ActionBarSherlock库中的正确替换类和方法。 如果这解决了问题,请告诉我们,因为我只是在脑子里这样做。