#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 в этом списке. Возможно, вы захотите запустить отдельный поток для этого, если вам нужно больше объяснений.