覆盖覆盖?

时间:2011-06-10 19:37:17

标签: java android

我在库中有一个包含菜单的活动。菜单包含所有标准属性以及onCreateOptionsMenu和onOptionsItemSelected上的@Override。

在我上面导入库的实际项目中,我有另一个活动,它延伸到活动之上。对于这个程序的这个特定实现,我想在这个活动上有一个不同的菜单,所以在这个活动代码库中添加onCreateOptionsMenu和onOptionsItemSelected与正确的@Override,但我从库中获取菜单,而不是库中的覆盖。

我可能做错了什么?

基类:

public class ListItems extends ListActivity {
    public static final int LOGOUT  = 0;
    public static final int HISTORY  = 1;
    public static final int REFRESH  = 2;


@Override
public boolean onCreateOptionsMenu(Menu menu){
    menu.add(0, LOGOUT ,0,"Log Out");
    menu.add(0,HISTORY,0,"Order History");
    menu.add(0,REFRESH,0,"SMS");
    return true;
}

@Override
public boolean onOptionsItemSelected (MenuItem item){
    TextView textView = (TextView)findViewById(com.imobileminutes.library.R.id.text);
    switch (item.getItemId()){
       case LOGOUT:
            Intent logOut = new Intent(ListItems.this,MainScreen.class);
            startActivity(logOut);
            finish();
            return true;
        case HISTORY:
            Intent orderHistory = new Intent(this,OrderItems.class);
            startActivity(orderHistory);
            return true;
        case REFRESH:
            Intent orderHistory = new Intent(this,OrderItems.class);
            startActivity(orderHistory);
            return true;
}
    return false;
}
}

覆盖班级

public class ListItems extends com.imobileminutes.library.ListItems {
    static final int SMS = 2;


@Override
public boolean onCreateOptionsMenu(Menu menu){
    Log.d("onCreateOptionsMenu", "My onCreateOptionsMenu ran");
    Toast.makeText(getApplicationContext(), "HEllo Menu Created", Toast.LENGTH_LONG).show();
    super.onCreateOptionsMenu(menu);
    return true;
}

@Override
public boolean onOptionsItemSelected (MenuItem item){
    Log.d("onCreateOptionsMenu", "My onOptionsItemSelected ran");
    Toast.makeText(getApplicationContext(), "HElloonOptionsItemSelected", Toast.LENGTH_LONG).show();

   super.onOptionsItemSelected(item);
    return false;
}

}

结论 它最终是我的库调用ListItems.this和CreateAccount.this,它引用了库中的活动而不是扩展类。

我为每个扩展活动类型添加了一个意图,然后调用它,从而调出扩展活动而不是基本活动。

感谢帮助人员。

3 个答案:

答案 0 :(得分:1)

要么您没有正确复制和粘贴代码,要么部分问题出在 base 类中,该类为onCreateOptionsMenu提供与派生类相同的定义:< / p>

@Override
public boolean onCreateOptionsMenu(Menu menu){
    menu.add(0, LOGOUT ,0,"Log Out");
    menu.add(0,HISTORY,0,"Order History");
    menu.add(0,REFRESH,0,"SMS");
    return true;
}

最后一行不对 - 我很确定基类实现的最后一行应该是:menu.add(0,REFRESH,0,"REFRESH");

但是,onCreateOptionsMenu的最后一行也需要在派生类中进行更改:

@Override
public boolean onCreateOptionsMenu(Menu menu){
    menu.add(0, LOGOUT ,0,"Log Out");
    menu.add(0, HISTORY,0,"Order History");
    menu.add(0, SMS,0,"SMS"); // Use the correct constant (SMS instead of REFRESH)
    return true;
}

编辑:此外,您可以通过对当前只是复制超类代码(LOGOUT和HISTORY)的那些选项重复使用超类实现来简化代码:

@Override
public boolean onOptionsItemSelected (MenuItem item){
    TextView textView = (TextView)findViewById(com.imobileminutes.library.R.id.text);
    // Left this as a 'switch'; you might want to use an 'if' instead.
    switch (item.getItemId()){
    case SMS:
        AppClass.sendSMS("8135551212", "Hello Jason");
        return true;
    }
    return super.onOptionsItemSelected(item);
}

答案 1 :(得分:0)

在导入时使用完全限定名称我怀疑你引用了错误的类。

答案 2 :(得分:0)

原来这就是我调用活动的方式。我直接在库中调用Activity而不是调用被覆盖的Activity。由于覆盖的那些将是动态的,具体取决于应用程序命名,我最终使用Intents来搜索调用者包名并将特定意图附加到其上。

一旦我完成了所有操作,我的短信菜单项就会显示出来。