Я видел много ответов, упоминающих setSupportActionBar
для панели инструментов внутри Fragment
, но этот подход может пойти не так, если у вас есть панель инструментов в Activity
и отдельная Toolbar
в Fragment
.
setSupportActionBar
с панели инструментов «Деятельности» на панель инструментов «Фрагмента» вы можете столкнуться с дублированием MenuItem
, даже если попытаетесь переопределить, используя setHasOptionsMenu(true)
. setSupportActionBar
внутри вашего фрагмента. Поэтому, чтобы избежать этого, я рекомендую использовать методы панели инструментов, подобные этому, во внутреннем фрагменте, чтобы раздувать меню и использовать
toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
toolbar.inflateMenu(R.menu.frag_menu_items);
Menu menu = toolbar.getMenu();
и использовать интерфейс Toolbar.OnMenuItemClickListener
для получения с событиями меню menuItems.
Редактировать (Раздел скопирован с MrEngineer13 answer )
и, если вас беспокоит кнопка «Назад», вы можете установить ее следующим образом
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
Конечно, возможно ] overload методы расширения. Ваш код является примером того, как именно это сделать.
Похоже, что вам нужна возможность переопределить методы расширения таким образом, чтобы тип среды выполнения объекта определял вызов метода расширения. Это похоже на определение виртуального метода в классе. Для такой функции нет специальной поддержки синтаксиса языка.
Если это действительно важно для вас, можно вручную реализовать эту функцию. Требуется немного грубой силы, но она выполнит свою работу. Например ...
public static class Extension {
public static void Method(this ParentClass p) {
var c = p as ChildAClass;
if ( c != null ) {
Method(c);
} else {
// Do parentclass action
}
}
public static void Method(this ChildAClass c) {
...
}
}
К сожалению, я не думаю, что вы сможете получить здесь то, что хотите. Методы расширения являются статическими, а статические методы не могут быть виртуальными.
Вы можете обойти это с помощью чего-то вроде решения JaredPar.
Если ваша цель - отделить вашу модель от некоторой реализации, Предлагаю вам изучить Образец моста (GOF). «Отделите абстракцию от реализации» Это может помочь разделить ваши проблемы и сохранить ваш класс модели более чистым.