跨不同标签的常用菜单

时间:2011-07-01 08:10:16

标签: android android-layout

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;

上述实施在其他两个选项卡上显示关于和刷新,但在清单选项卡上,它仅显示在库存标签中定义的两个选项卡。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我不知道你的两个代码示例是否在同一个类中(我从未使用过tabactivity)但是我会在两种情况下都是anwser。

  • 如果库存标签位于MainApp以外的其他类中:

在第一个代码示例中,您执行

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,每次都会给公共菜单充气。