Android get toolbar from fragment

Fragment Toolbar.

Manage it better.

Introduction

Since I started work commercially I met an opinion that working with Fragments is not always intuitive, at least not as much as working with Activities. Especially after watching this video your mindset in context of Fragments might change significantly. Complicated lifecycle, hard management will not change the way of thinking about it.

Few weeks ago I had to deal with really big thing. I’ve moved big app built in 95% on Activities to Fragments. I was very long way, very hard one. I’ve learnt a lot, so wanted to share this knowledge with you.

Toolbar for Fragment. What is wrong with it ?

Let’s assume that we have only one Activity with bottom navigation and the rest of views are Fragments. Normally on every Fragment change toolbar is set as supportActionBar which gives you possibilities to use methods to create, prepare, manage toolbar options menu. It looks simple, doesn’t it?
But it also creates some problems:

  • Before creating new toolbar on another Fragment you need to clear the old one.
  • If you are clearing it, indeed you are losing state and all data.
  • When you are going back to previous Fragments you have to recreate whole action bar.

As you can see it is a very inconvenient process, hard to maintain and generates a lot of boilerplate code. Especially if you are using searchView all those disadvantages mentioned above are unacceptable.

What is the solution ?

Assuming that we have few types of toolbar in app, you can build it using Builder Pattern and handle all cases in one place. All work comes down to choosing options for your Toolbar.

Starting point is to select one of two possible solutions. First one suggests to create one Toolbar and add it from code to your views. The second, which I have chosen is to implement toolbar in every Fragment’s .xml file. Basically, it was much easier for me because it was already done (refactoring code from Activities), so code below will match the second option.

Lets create FragmentToolbar Builder which contains all options we need in our app. I’m using Kotlin to achieve it, but my Fragments are still in Java, so I had to use implementation readable for Java.

Nothing revealing, let’s add those options to our toolbar.

Create BaseFragment which will be inherited by every Fragment.

Finally we are prepared to create Toolbars for our Fragments! Now every Fragment must specify which options will be used or if the Toolbar should even exist. Following the simple example:

To more complex:

Summary

Everyone knows how much time we spend on adding menu options and how many lines in code we need to write or copy/paste. This solution saves your time and keeps code clean. No need to set toolbar as supportActionBar. You don’t have to worry about keeping state and data for menu when Fragment changes (it lives as long as your Fragment). To sum up, management is as simple as possible and fragmentManager backstack changes (adding / removing Fragments) has no effect on toolbar at all.

Читайте также:  Как снести андроид хонор 10 лайт

Personally I feel better when I’m dealing with Activities. Working with Fragments pushed me to simplify this process. So when you’ll be in the same situation — don’t fight with it, just do it by your own.

If you like my work hit clap button and let me know what you think in comments!

Источник

Как получить панель инструментов из фрагмента?

У меня есть ActionBarActivity с NavigationDrawer и использовать support_v7 Toolbar в ActionBar. В одном из моих фрагментов панель инструментов имеет настраиваемый вид. В остальных фрагментах Toolbar следует указывать заголовок.

Как получить Toolbar инстанс для настройки из фрагментов? Я могу получить ActionBar getActivity().getActionBar() , но если я вызываю setTitle() этот экземпляр ActionBar, он ничего не делает.

UPD:

(как сказал MrEngineer13) не работают при создании первого фрагмента, потому что я вызываю его из onHiddenChanged (). Теперь я добавляю еще один в onCreateView (), и он отлично работает.

Вы должны бросить вашу деятельность от getActivity() к AppCompatActivity первому. Вот пример:

Причина, по которой вы должны его использовать, заключается в том, что getActivity() возвращает a, FragmentActivity и вам нужен AppCompatActivity

Если фрагменты должны иметь настраиваемый вид ToolBar, вы можете реализовать ToolBar для каждого фрагмента отдельно.

добавить ToolBar в fragment_layout:

найди во фрагменте:

прослушиватель меню может быть создан двумя способами: переопределить onOptionsItemSelected в вашем фрагменте:

или установите прослушиватель для панели инструментов при ее создании в onCreateView ():

У вас есть два варианта получить панель инструментов во фрагменте

Для пользователей Kotlin (activity as AppCompatActivity).supportActionBar?.show()

Может, getActivity().getSupportActionBar().setTitle() стоит попробовать, если вы используете support_v7.

Из вашего фрагмента: (получить панель инструментов из фрагмента?)

это очень полезно, когда вы используете счетчик на панели инструментов и вызываете счетчик или настраиваемые представления на панели инструментов из фрагмента!

Из вашей деятельности:

Котлин: во фрагменте.kt -> onCreateView ()

Я сделал это, выполнив следующие действия.

  1. Установите заголовок, используя приведенный ниже код в onCreateView основном фрагменте.
  1. Для переключения между фрагментами я использую нижнюю панель навигации, которая реализована в MainActivity (Родительская активность) фрагмента. Даже если вы используете любую кнопку или пункт меню, вы можете изменить заголовок onSelectedItemClickListener , как это сделал я в моем случае.

если вы используете настраиваемую панель инструментов или ActionBar и хотите получить ссылку на свою панель инструментов / панель действий из фрагментов, вам необходимо сначала получить экземпляр основного действия из метода onCreateView фрагмента, как показано ниже.

затем используйте активность для дальнейшей реализации, как показано ниже

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

Сначала установите общедоступную панель инструментов, например

и в методе onCreate () назначьте идентификатор пользовательской панели инструментов

Источник

Android Fragment Result Listener

В Android передача данных между фрагментами может осуществляться разными способами: передача через родительскую Activity, используя ViewModel или даже Fragments API. Fragment Target API с недавних пор получил статус Deprecated и вместо него Google рекомендует использовать Fragment result API.

Что такое Fragment result API? Это новый инструмент от Google который позволяет передавать данные между фрагментами по ключу. Для этого используется FragmentManager, который в свою очередь реализует интерфейс FragmentResultOwner. FragmentResultOwner выступает в качестве центрального хранилища для данных, которые мы передаем между фрагментами.

Читайте также:  Как найти android если он потерялся

Как это работает?

Как упоминалось выше, наш FragmentManager реализует интерфейс FragmentResultOwner, который хранит в себе ConcurrentHashMap . Эта HashMap хранит наши Bundle-ы по строковому ключу. Как только один из фрагментов подписывается (или уже подписан) то он получает результат по тому самому ключу.

Что важно знать:

  • Если какой-либо фрагмент подписывается на результат методом setResultFragmentListener() после того, как отправляющий фрагмент вызовет setFragmentResult() , то он немедленно получит результат
  • Каждую связку “Key + Result (Bundle)“ фрагмент получает только 1 раз
  • Фрагменты которые находятся в бек стеке получат результат только после того как перейдут в состояние STARTED
  • После того как фрагмент перейдет в состояние DESTROYED мы больше не сможем подписываться на ResultListener

Как это выглядит в коде?

Передача данных

Для передачи данных в другой фрагмент нам необходимо вызвать метод:

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

Получение данных

Для получения данных через FragmentManager мы регистрируем наш FragmentResultListener и задаем ключ по которому мы будем получать данные. Тот самый ключ который мы указывали в методе FragmentManager.setFragmentResult()

Здесь мы видим 2 аргумента: key: String и bundle: Bundle.
Первый — это тот самый ключ, по которому мы передаем сюда данные. Второй — Bundle, в котором лежат переданные данные.

Parent Fragment Manger

Выбор FragmentManager-а для передачи данных между фрагментами зависит от принимающего фрагмента:

  • Если оба фрагмента находятся в одном и том же FragmentManager (например оба фрагмента находятся в Activity), то мы должны использовать родительский FragmentManager, который хранит в себе Activity
  • Если у нас один фрагмент вложен в другой фрагмент, то для передачи данных мы используем childFragmentManager (он же родительский фрагмент для принимающего фрагмента)

Важно понимать, что наш FragmentResultListener должен находиться в общем для двух фрагментов FragmentManager-е.

Тестирование

Для тестирования отправки/получения данных через FragmentResultListener, мы можем использовать FragmentScenario API, который предоставляет нам все преимущества тестирования фрагментов в изоляции.

Передача данных

Как мы можем протестировать, что наш фрагмент корректно отправляет данные через родительский FragmentManager? Для этого нам необходимо внутри теста отправить результат и проверить, что наш FragmentResultListener получил корректные данные:

Получение данных

Для проверки корректности получения данных мы можем симулировать отправку данных, используя родительский FragmentManager. Если в отправляющем фрагменте корректно установлен FragmentResultListener мы должны получить корректные данные проверяя сам листенер или последствие их получения.

Вывод

В данный момент FragmentResultListener находится в альфе, а это значит что возможно еще будут изменения со стороны Google. Но уже сейчас видно, что это достаточно крутой инструмент, для передачи данных между фрагментами, не создавая дополнительных интерфейсов и классов. Единственным нюансом остается, пожалуй то, что не совсем понятно, как и где лучше хранить ключи где, но это не кажется таким уж большим минусом.

Для того чтоб получить возможность использовать FragmentResultListener нам нужно подключить в зависимостях версию фрагментов 1.3.0-alpha04 или новее:

Источник

Установить заголовок inToolBar из фрагмента в Android

Я использую последнюю панель инструментов из appcompatv7 lib.Я поместил textview в ViewGroup панели инструментов, и я хочу установить заголовок в этом Textview из фрагмента в моей деятельности.В случае настраиваемой панели действий ((ActionBarActivity)getActivity).setcustomView(..) сделал бы свою работу.Но из-за использования этой панели инструментов я не могу использовать это.Также я реализовал метод в своей BaseActivity, который наследуется всеми действиями.Эта BaseActivity содержит мой метод для инициализируйте выдвижной ящик слева.Я должен инициализировать метод initDrawerLayout () в activity, иначе ящик не будет инициализирован.И если я инициализирую его во фрагменте, он дает мне все пустые результаты, ни кнопка переключения для ящика, ни пользовательский заголовок не устанавливаются.

Читайте также:  Android для suzuki 2013

Это мой код initDrawer..

и это мой код во фрагменте..

((FirstActivity) getActivity()).initDrawerLayout(mFirst.name); где mFirst-объект класса Person

и код панели инструментов..

пожалуйста помогите парни..

13 ответов

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

Я делаю это, как это: из фрагмента вызов

Также вы можете вызвать любую функцию вашей родительской деятельности следующим образом:

ответ записывается ниже в oncreateview метод фрагментов.

Если у вас есть setSupportActionBar в вашей деятельности, то вы можете легко изменить заголовок панели инструментов из вашего фрагмента

вы можете изменить название панели инструментов на событии OnAttach, что-то вроде этого

Если вы используете пользовательскую панель инструментов, это поможет вам:

если кто-то борется с этой проблемой, это может быть полезно.

в основном у вас есть 4 варианта, как с этим справиться:

  • используйте интерфейс для связи с вашей деятельностью или любым другим удобным методом, таким как шина событий.
  • вы называете getActivity().setTitle(«Title») , но в этом случае вам нужно прикрепить свой Toolbar до ActionBar по телефону setSupportActionBar() в вашей деятельности.
  • вы можете иметь открытый экземпляр Toolbar и доступ к этому экземпляру из фрагмента.

наконец, если вам нужен экземпляр Toolbar (вы можете сделать что-то еще), вы можете просто получить его таким образом:

Ну, последний вариант решит проблему, только если Toolbar не был передан setSupportActionBar метод.

если это было, то вам нужно вызвать этот метод в вашем активность:

что решит проблему.

тем не менее, я бы предложил использовать ButterKnife что сделает его немного чище, вот пример:

Источник

Создание ToolBar в Fragment

Создаю активити на нем фрагмент, а в фрагменте должен быть ToolBar! Но его нет! Делаю так

высоту/ширену задаю в стилях !

Вроде все так! Может что-то пропустил? Подскажите в чем ошибка моя !! Спасибо!

Обновление fragment из другого fragment
Добрый вечер всем!! Подскажите пожалуйста как обновить один фрагмент из другого (а именно TextView.

Создание Toolbar’ а
Необходимо создать Toolbar с 3-я кнопками, по нажатию которых будут вызваны диалоги: a) открытие.

Создание Toolbar
Привет! Столкнулся с проблемой, нужно сделать Toolbar ( как VS Windows Form или QT creator).

Создание Toolbar
Нужно из имеющего изображения кнопок создать панель инструментов. Делаю все, как описано на MSDN.

поместить тулбар во фрагмент можно, но это не кошерно и глупо
в идеале есть активити в которой тулбар и под тулбаром какой-то лаяут
и этот лаяут используется как контейнер для фрагментов

если нужно делать свое меню для каждого фрагмента то можно почитать тут

Решение

Создание ToolBar: CreateToolbarEx()
Здравствуйте! Не получается создать ToolBar. На мой взгляд все правильно, но вылазит ошибка .

Создание кнопок на ToolBar-е
Создаю Win32 Application, в оконной процедуре главного окна пишу (WM_CREATE): DWORD dwStyle;.

Создание toolbar для ie 6+ на C#
Необходимо создать с 0 toolbar для ie 6++ на c#. Был бы благодарен за любую информацию, литературу.

Динамическая форма — Создание ToolBar
Доброго времени суток, Уважаемые спецы! Столкнулся с необходимостью создания нового ToolBar в окне.

Источник

Оцените статью