Меню СУХИХ опций на Android

#android #android-menu

#Android #android-menu

Вопрос:

Я изучаю создание меню опций для приложений Android.

В руководстве содержится следующий совет, как оставаться сухим при работе с меню:

Совет: Если ваше приложение содержит несколько действий и некоторые из них предоставляют одно и то же меню опций, рассмотрите возможность создания действия, которое не реализует ничего, кроме методов onCreateOptionsMenu() и onOptionsItemSelected(). Затем расширьте этот класс для каждого действия, которое должно использовать одно и то же меню опций. Таким образом, вам придется управлять только одним набором кода для обработки действий меню, и каждый класс-потомок наследует поведение меню.

Это кажется проблематичным. Если Activity -ы, которым необходимо совместно использовать одни и те же параметры, наследуются от разных классов, от чего должен наследовать мой OptionsMenuActivity ? Я читал, что Java не поддерживает множественное наследование, так как же вы это обойдете?

Ответ №1:

Ваше действие, содержащее код для меню опций, должно расширять класс Activity.

 public class YourRootActivity extends Activity {

// Any other stuff that you want for all activities

 public boolean onCreateOptionsMenu(Menu menu){
 // your main options menu
 }
}
  

Теперь для классов, которым нужно это меню, заставьте их расширить действие, которое мы создали выше.

 class Activity1 extends YourRootActivity {
}
  

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

Комментарии:

1. Я понимаю этот подход. Но что мне делать, если Activity1 расширяет Activity, а Activity2 расширяет какой-то другой класс?

2. Activity2 не может расширить другой класс. Если вы определяете подкласс Activity, то вы должны расширить Activity или подкласс Activity. Ответ Achie хорош

3. Это недостаток Java, который в большинстве случаев можно обойти, тщательно реализуя классы и используя интерфейсы для реализации таких случаев. Но в нашем случае, поскольку мы не хотим записывать весь класс Activity для Android, нам приходится идти на компромисс. В приведенном выше случае будут случаи, когда нам, возможно, придется расширить TabActivity или MapsActivity. В этих и любых других подобных случаях нам придется снова реализовать код меню опций в соответствующих действиях.

4. Это похоже на недостаток в архитектуре Android: мне приходится повторяться, если я хочу, чтобы одни и те же параметры применялись к действиям, которые расширяют разные классы.

5. Это абсолютно возможно, и возможно просто, чтобы оба этих класса расширяли пользовательскую YourRootActivity, как описано выше. В случае ListActivity вместо расширения ListActivity он может расширить только обычную активность и получить listview из кода и установить ListAdapter в этом списке. Возможно, вы захотите запустить отдельный поток для этого, если вам нужно больше объяснений.