Там какой-либо путь состоит в том, чтобы перегрузить дополнительные методы в C#?

Я видел много ответов, упоминающих setSupportActionBar для панели инструментов внутри Fragment, но этот подход может пойти не так, если у вас есть панель инструментов в Activity и отдельная Toolbar в Fragment.

  1. При перемещении setSupportActionBar с панели инструментов «Деятельности» на панель инструментов «Фрагмента» вы можете столкнуться с дублированием MenuItem, даже если попытаетесь переопределить, используя setHasOptionsMenu(true).
  2. Во-вторых, если вы хотите обновить панель инструментов деятельности, вы увидите, что ваши изменения не отражены из-за 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
   }
});

5
задан Tim Rogers 26 March 2012 в 09:48
поделиться

2 ответа

Конечно, возможно ] 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) {
    ...
  }
}
5
ответ дан 14 December 2019 в 13:45
поделиться

К сожалению, я не думаю, что вы сможете получить здесь то, что хотите. Методы расширения являются статическими, а статические методы не могут быть виртуальными.

Вы можете обойти это с помощью чего-то вроде решения JaredPar.

Если ваша цель - отделить вашу модель от некоторой реализации, Предлагаю вам изучить Образец моста (GOF). «Отделите абстракцию от реализации» Это может помочь разделить ваши проблемы и сохранить ваш класс модели более чистым.

1
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: