2014-04-01 98 views
2

我有10个活动扩展了baseActivity。我的BaseActivity基本上有一个帮助菜单图标。当用户按下帮助菜单图标时,我应该显示该活动的帮助菜单。我怎样才能知道哪些活动称为帮助菜单,所以我知道该XML资源显示如何知道哪个活动点击了按钮?

public class BaseActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.help_menu, menu); 
     return true; 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.help_menu_item: 
        displayHelpMenu();   
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    protected void displayHelpMenu(){ 

      // I will load the xml to the textview and display it in dialog. How can I know which xml resource to load 

    } 
} 

回答

3

一种方法找出Activity是使用instanceOf。这样的事情:

protected void displayHelpMenu() { 
    // I will load the xml to the textview and display it in dialog. 
    // How can I know which xml resource to load 

    if(this instanceOf DerivedActivity.class) { 
     // load XML file 
    } 
    else if(...) { 
    ... 
    } 
} 

但是,在我看来,虽然这解决了你的问题,但这不是正确的做事方式。在面向对象的情况下,你应该使用方法覆盖

base class定义加载资源的一般功能,而派生类应提供要加载的文件的名称。换句话说,base class不应该知道derived class。一个更好的解决办法是:

protected void displayHelpMenu() { 

    // ask each child class for the help menu resource file 
    int resId = getHelpMenuResource(); 

    // write code to load XML file with resId 
    ... 
    ... 
} 

protected int getHelpMenuResource() { 
    return defaultMenuId; 
} 

现在在派生类中,@OverridegetHelpMenuResource()方法并返回特定于该活动的资源ID。

+0

伟大的解决方案。我喜欢替代品..接受:) – Snake

1

如何使您的BaseActivity抽象并添加getMenuResource方法?

public abstract class BaseActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.help_menu, menu); 
     return true; 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.help_menu_item: 
        displayHelpMenu();   
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    protected void displayHelpMenu(){ 

      // I will load the xml to the textview and display it in dialog. How can I know which xml resource to load 
     int menuResourceId = getMenuResourceId(); 
     // do the rest 
    } 

    public abstract int getMenuResourceId(); 
} 
+0

谢谢。好的解决方案,但其他人击败你:) – Snake

相关问题