2014-10-07 2 views
2

Я использую тот же tabBar для нескольких видов деятельности. И поскольку для onOptionsItemSelected существует обширная логика, я хочу написать соответствующие методы один раз, а затем повторно использовать их. Поэтому я решаю создать суперкласс под названием CustomActionBarActivity, а затем продлить его действие детьми. Одна из проблем, с которыми мне нужна помощь, - это как я могу определить, какой из них вызвал вызов onOptionsItemSelected? Чтобы разъяснить, я представлю общий код, а затем неудачную попытку решения.Как определить, какой ребенок вызвал метод родителя

Вот общий код

public class CustomActionBarActivity extends FragmentActivity { 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.tab_dog: 
       startActivity(new Intent(this, DogActivity.class)); 
       return true; 
      case R.id.tab_cat: 
       startActivity(new Intent(this, CatActivity.class)); 
       return true; 
      case R.id.tab_mouse: 
       startActivity(new Intent(this, MouseActivity.class)); 
       return true; 
      case R.id.tab_goose: 
       startActivity(new Intent(this, GooseActivity.class)); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

} 

неудачная попытка

Если я стараюсь, например,

case R.id.tab_dog: 
    if(!(this instanceof DogActivity)) 
    startActivity(new Intent(this, DogActivity.class)); 

тогда я получаю ошибку компиляции таким образом, что CustomActionBarActivity является несовместим с DogActivity. Спасибо за любую помощь, которую вы можете предоставить.

+0

Я отредактировал и изменил 'if (this instanceof DogActivity)' to 'if (! (This instanceof DogActivity)), поэтому люди могут получить значение проверки' instanceof'. – learner

+0

Я не уверен, что понимаю ... «Собственные действия», «CatActivity» и т. Д. Должны быть дочерними классами? Или это просто произвольные действия? –

ответ

1

Вместо того, чтобы родительский класс осматривал детей, использующих отражение (что довольно хрупко, поскольку оно не масштабируется с количеством подклассов детей, которые вы создаете), возможно, вы могли бы использовать динамическую диспетчеризацию.

Например, может быть, вы могли бы объявить abstract метод в родительской деятельности, как:

protected abstract void onTabItemSelected(MenuItem item); 

Тогда ваши дети действия могут переопределить этот метод в зависимости от желаемого поведения. Например, DogActivity может реализовать это следующим образом:

protected boolean onTabItemSelected(MenuItem item) { 
    if (item.getItemId() != R.id.dog_tab) { 
     startActivity(new Intent(this, DogActivity.class)); 
     return true; 
    } 
    return false; 
} 

onOptionsItemSelected метод затем будет реализована следующим образом:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (onTabItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Позвольте мне знать, если я неправильно понял вопрос. В любом случае, вы можете изменить этот подход в соответствии с вашим вариантом использования.

Смежные вопросы