在哪里声明onOptionsItemSelected以供全局使用?

时间:2013-03-27 17:53:26

标签: java android

我对Android开发很新。

在我的MainActivity.java文件中,我声明了一种onOptionsItemSelected(MenuItem menu)方法,允许用户在当前MainActivity.java页面和我创建的另一个名为Settings.java的页面之间跳转。

当用户转到Settings.java页面时,他们点击菜单中的Home选项,没有任何反应。我知道这是因为onOptionsItemSelected(MenuItem menu)仅在MainActivity.java类中定义,而不在Settings.java类中定义。

我现在通过将onOptionsItemSelected(MenuItem menu)MainActivity.java复制到Settings.java来克服这个问题。但这非常多余。

我应该在哪里声明可以在不同类中重复使用的方法?

MainActivity.java

public class MainActivity extends Activity {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                showMsg("Settings Clicked");
                this.startActivity(new Intent(this, Settings.class));
                return true;
            case R.id.action_home:
                showMsg("Home clicked");
                this.startActivity(new Intent(this, MainActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void showMsg(String msg) {
        Toast toast = Toast.makeText(this.getBaseContext(), msg, Toast.LENGTH_LONG);
        toast.show();
    }
}

Settings.java

public class Settings extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                this.startActivity(new Intent(this, Settings.class));
                return true;
            case R.id.action_home:
                this.startActivity(new Intent(this, MainActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果您创建一个名为BaseActivity的活动,其中包含您的公共onOptionsItemSelected()代码,则将此类扩展为创建MainActivitySettings这两个类都将使用{{ 1}} class'(即super's)BaseActivity

另一种方法是切换到Fragments,因为Fragments使用主机Activity onOptionsItemSelected()以及他们自己的。这两种策略都允许您使用“集中式”代码,而不必维护多个“剪切和粘贴”副本。