Newbee到Android开发。 我正在开发一个应用程序,它有三个不同的选项卡。我希望在所有选项卡上都有常用的菜单选项,如关于和刷新,并且每个人都需要相应的特定菜单。
MyAPP Main():
public class MyApp extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, Bundles.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("bundles").setIndicator("Bundles",
res.getDrawable(R.drawable.ic_tab_bundle_grey))
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, Policies.class);
spec = tabHost.newTabSpec("policies").setIndicator("Policies",
res.getDrawable(R.drawable.ic_tab_policy_grey))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, Inventory.class);
spec = tabHost.newTabSpec("Inventory").setIndicator("Inventory",
res.getDrawable(R.drawable.ic_tab_settings_grey))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.layout.menu, menu);
return true;
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.about:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.refresh:
Intent j = new Intent(this, RefreshAgent.class);
startActivity(j);
break;
// more buttons to go here later
}
}
在其他“广告资源”标签中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.layout.settings_menu, menu);
return true;
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.register:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.reregister:
Intent j = new Intent(this, Reregister.class);
startActivity(j);
break;
case R.id.accountsettings:
Toast.makeText(this, "Account Settings", Toast.LENGTH_LONG).show();
break;
}
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.register:
Toast.makeText(this, "Registration Not implemented!", Toast.LENGTH_LONG).show();
return true;
case R.id.reregister:
Toast.makeText(this, "Re Registration Not implemented!", Toast.LENGTH_LONG).show();
//TODO : Use refresh agent class
//startActivity(new Intent(this, RefreshAgent.class));
return true;
case R.id.accountsettings:
//Intent j = new Intent(this, RefreshAgent.class);
//startActivity(j);
Toast.makeText(this, "Account Settings", Toast.LENGTH_LONG).show();
break;
}
return false;
上述实施在其他两个选项卡上显示关于和刷新,但在清单选项卡上,它仅显示在库存标签中定义的两个选项卡。
提前感谢您的帮助。
答案 0 :(得分:1)
我不知道你的两个代码示例是否在同一个类中(我从未使用过tabactivity)但是我会在两种情况下都是anwser。
在第一个代码示例中,您执行
inflater.inflate(R.layout.menu, menu);
显示about和refresh菜单的是这一行。 在您的广告资源标签中,您为R.layout.settings_menu充气,该广告不包含和刷新,这就是您在所有标签中没有公共菜单的原因。
你需要在你的所有标签R.layout.menu中膨胀(我建议你重命名common_menu)。
例如,在库存标签上,您只需要这样做:
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.layout.menu, menu);
inflater.inflate(R.layout.settings_menu, menu);
return true;
菜单按此顺序充气,因此您将在底部看到常用菜单,并在顶部看到特定菜单。
如果你有动力,你可以做一个“基础活动”,他们会在onCreateOptionMenu上夸大常用菜单,在你的特定活动中(谁会扩展你的基础活动),你可以调用super.onCreateOptionMenu(),膨胀你需要的东西。
您需要在当前标签显示的功能中充气另一个菜单。有一个问题很严重,onCreateOptionMenu只被活动调用一次,所以如果你更改选项卡并按菜单,它将只显示先前的菜单。
幸运的是,您还可以使用另一种方法。它是onPrepareOptionMenu()。每次在应用程序中显示菜单时都会调用此方法。所以,你只需要在这里夸大你的特定菜单。 您可以阅读以下链接:http://developer.android.com/guide/topics/ui/menus.html
但基本上,你必须这样做:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
if(Tab == Inventory) {
inflater.inflate(R.layout.settings_menu, menu);
}
return true;
}
并保留你的第一个onCreateOptionMenu,每次都会给公共菜单充气。