ActionBarSherlock有多个MenuItems?

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

我已经尝试了我能想到的一切,但它没有用。 我改变了onOptionItemSelected,因为我认为这是我需要编辑的方法。

编辑:

我一直在关注@ Ollie的建议,但LogCat和Debug都没有显示出奇怪的东西。 也许它在代码的其他部分,或ABS的声明? 这是整个代码,如果你能看一遍,那就太好了!

整个Activity的代码,因为它可能在其他地方?

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吗? 发表在这里:

      

像这样创建菜单:

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

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

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

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

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