Change ActionBar title using Fragments
So my problem is that when the user clicks the contact, that takes me to the other fragment but the title on the action bar still with the favorite title and not the new one, how to change that title?
I have already try to use setTitle on the click method but still not working.
6 Answers 6
In your activity:
And in your fragment (You can put it onCreate or onResume):
In your fragment
If you are using Navigation Components from Android Jetpack. The action bar reads the Label attribute for the fragment name. Not sure if this is a proper fix, but if you change the Label text in the Navigation Editor, it will be read by the supportActionBar that is set up in the Activity hosting the fragments.
Em Kotlin você pode usar o seguinte código nas funções: onCreateView, onStart e onResume.
Ou se preferir, pode criar uma função de extensão e chamar dentro do Fragment.
Chamada da função de extensão dentro do Fragment.
NOT_A_PROGRAMMER’s answer is right but when you come back to the previous activity or fragment the Title remains the same.
Here is my solution for that.
- Overriding OnPause() or OnStopMethod in the fragment and you can use the same method » ((MainFragmentActivity) getActivity()).setActionBarTitle(«Your title»); » to set the title of the Activity or Fragment which is present in the backstack.
Источник
How to set the title of DialogFragment?
This should be a simple task, but for some reason I can find a way to set the title of a DialogFragment. (I am setting the dialog contents using onCreateView overload).
The default style leaves a place for the title, but I can’t find any method on the DialogFragment class to set it.
The title is somehow magically set when the onCreateDialog method is used to set the contents, so I wonder if this is by design, or there is a special trick to set it when using the onCreateView overload.
6 Answers 6
You can use getDialog().setTitle(«My Dialog Title»)
Does overriding onCreateDialog and setting the title directly on the Dialog work? Like this:
Jason’s answer used to work for me, but now it needs the following additions to get the title to show.
Firstly, in your MyDialogFragment’s onCreate() method, add:
Then, in your styles.xml file, add:
After hours of trying different things, this is the only one that has done the trick for me.
NB — You may need to change the Theme.AppCompat.Light.Dialog.Alert to something else in order to match the style of your theme.
DialogFragment could be represented as dialog and as Activity. Use code below that would work properly for both
You can take a look at the official docs. The way i did is like this:
Similar to Ban Geoengineering’s answer, but with a few modifications, so instead of coding what specific theme to use in the DialogFragment , I override the default style used by DialogFragment s in my styles.xml .
set the title in the androidx.fragment.app.DialogFragment .
in your app theme in styles.xml , override android:dialogTheme , which is the default style used by DialogFragment instances.
also in styles.xml , declare the dialog theme that will be used by DialogFragment instances. it’s important for this style to inherit from ThemeOverlay so that it will preserve your app’s theme colors.
make sure that the activity that is spawning the DialogFragment is using the defined AppTheme .
Источник
Установить заголовок inToolBar из Fragment в Android
Я использую последнюю панель инструментов из AppCompatv7 lib.I поместил текстовое представление в панель инструментов ToolBar. Я хочу установить заголовок в это текстовое представление из фрагмента в моей активности. В случае пользовательской панели действий ((ActionBarActivity ) getActivity).setcustomView(..) выполнил бы эту работу. Но из-за использования этой ToolBar я не могу использовать это. Также я реализовал метод в моей BaseActivity, который унаследован всеми Activity.This BaseActivity содержит мою метод для инициализации скользящего ящика слева. Мне нужно инициализировать метод initDrawerLayout() в активности, иначе ящик не будет инициализирован. И если я инициализирую его по фрагменту, он даст мне все пустые результаты, ни кнопка переключения для ящика и равно как и настраиваемый заголовок.
Это мой код initDrawer.
И этот мой код в фрагменте.
((FirstActivity) getActivity()).initDrawerLayout(mFirst.name); где mFirst — объект класса Person
и код панели инструментов.
ОТВЕТЫ
Ответ 1
Чтобы разрешить фрагменту взаимодействовать до его действия (для установки заголовка панели инструментов), вы можете определить интерфейс в классе фрагмента и реализовать его в действии, как описано здесь: связь с другими фрагментами.
Ответ 2
Я делаю это вот так: из вызова фрагмента
Также вы можете вызывать любую функцию родительской активности следующим образом:
Ответ 3
Ответ 4
Ответ описан ниже в методе oncreateview фрагментов.
Ответ 5
Если у вас есть SetSupportActionBar в вашей деятельности, то вы можете легко изменить заголовок панели инструментов из вашего фрагмента
Ответ 6
Вы можете создать интерфейс внутри фрагмента. проверьте ниже: —
Это работает для меня. 🙂
Ответ 7
Эта работа для меня:
Ответ 8
Вы можете изменить название вашей панели инструментов на событии OnAttach, что-то вроде этого
Ответ 9
Если вы используете настраиваемую панель инструментов, это поможет вам:
Ответ 10
Если кто-то борется с этой проблемой, это может быть полезно.
В принципе у вас есть 4 варианта, как это сделать:
- используйте интерфейс для связи с вашей деятельностью или любым другим удобным способом, например, с шиной событий.
- вы вызываете getActivity().setTitle(«Title») , но в этом случае вам нужно прикрепить Toolbar к ActionBar , вызвав setSupportActionBar() в вашей деятельности.
- У вас может быть открытый экземпляр вашего Toolbar и получить доступ к этому экземпляру из фрагмента.
Наконец, если вам нужен экземпляр вашего Toolbar (вы можете сделать что-то еще с), вы можете просто получить его следующим образом:
Ну, последний вариант разрешил бы проблему, только если Toolbar не был передан методу setSupportActionBar .
Если это было, вам нужно вызвать этот метод в своей деятельности:
который решит проблему.
Однако я бы предложил использовать ButterKnife, что сделает его немного более чистым, вот пример:
Ответ 11
Ответ 12
В вашей деятельности объявить панель инструментов общедоступной.
Затем из вашего фрагмента
Ответ 13
Вам нужно установить заголовок в действии, выполняющем фрагмент, и вернуть фрагмент
Это работает для меня.
Ответ 14
Найти TextView Id на панели инструментов
если вы используете активность
если вы используете фрагмент
Ответ 15
Для меня проблема была в том, что по какой-то причине лейбл был перезаписан. Мне пришлось изменить его обратно на строковый ресурс, в
Источник
Полный список
— работаем с PreferenceFragment
— используем Headers
В Уроках 71-75 мы рассматривали особый вид Activity – PreferenceActivity. Оно позволяет нам удобно работать с Preferences. Для фрагментов есть аналог – это PreferenceFragment, имеющий тот же функционал.
В Android 3 у PreferenceActivity появилась новая возможность – Headers (заголовки). Они позволяют на больших экранах без труда отображать настройки, разделенные на две панели по вертикали. Если же экран мал для такого разделения, то эти панели будут на разных экранах.
Создадим приложение, в котором используем PreferenceFragment с простыми настройками. А далее переделаем его под использование заголовков.
Project name: P1111_PreferenceFragment
Build Target: Android 4.1
Application name: PreferenceFragment
Package name: ru.startandroid.develop.p1111preferencefragment
Create Activity: MainActivity
Добавим строки в strings.xml:
Тексты будут использоваться для описания настроек, а массивы – для списка.
Cоздадим файл, описывающий настройки. Для этого в папке res создаем папку xml, если ее там нет. И создаем файл: res/xml/pref1.xml:
Три простейших настройки. Я не буду повторяться, и описывать значения элементов и атрибутов. Все это уже описано в Уроке 71.
Итак, файл настроек создан. Нужен фрагмент, который эти настройки нам покажет. Создаем класс Fragment1, наследующий android.preference.PreferenceFragment.
Метод addPreferencesFromResource прочитает файл с описанием настроек и выведет их на экран.
Осталось немного подправить MainActivity.java:
Мы здесь не используем никакой layout, а сразу добавляем наш фрагмент в качестве контента, используя корневой контейнер с ID android.R.id.content.
Все сохраняем и запускаем приложение. Видим экран настроек
Можно поставить галку или нажать на два других пункта настроек и получить диалоговое окно для ввода значения. Все как обычно.
Заголовки
Теперь рассмотрим, что нам дают заголовки. Можно сказать, что заголовки — это корневые ветки дерева настроек. Мы сделаем три таких ветки: первые две будут открывать наши фрагменты с настройками, а третья откроет настройки звука.
Один фрагмент с настройками у нас уже есть, создадим второй.
Добавим строки в strings.xml:
Создадим файл res/xml/pref2.xml:
Здесь используем те же простые элементы, что и ранее, а также – категории и экраны (Урок 72). Только в экранах мы указываем не дочерние элементы, а перенаправления. В первом экране с помощью атрибута android:fragment мы указываем Fragment1, который мы создали в начале урока. А во втором экране указываем intent, который откроет в браузере страницу.
Создаем фрагмент, который нам эти настройки покажет.
Переходим к созданию заголовков
Создаем файл с описанием заголовков res/xml/pref_head.xml:
Три заголовка. Первый откроет Fragment1, второй – Fragment2, третий, используя intent, – настройки экрана. Иконки взяты случайные.
Ок. Заголовки есть, теперь надо их отобразить. Для этого используем MainActivity. Но, чтобы оно умело работать с заголовками, оно должно наследовать PreferenceActivity.
Метод )» target=»_blank» rel=»noopener noreferrer»>onBuildHeaders вызывается системой, когда надо строить заголовки. На вход он принимает список List , который нам надо наполнить. Для этого вызываем метод )» target=»_blank» rel=»noopener noreferrer»>loadHeadersFromResource, и передаем ему наш файл с заголовками и наполняемый список.
Все сохраняем и запускаем. Я использую для запуска AVD, эмулирующий планшет на 4.1
Приложение выглядит так:
Мы видим три заголовка, которые мы прописывали в файле pref_head.xml. Открыт первый — Header 1, он отображает Fragment1. А Fragment1 отображает настройки из pref1.xml.
Нажмем на второй заголовок — Header 2.
Видим Fragment2 с настройками из pref2.xml. Видны категории и экраны, которые мы создавали. Напомню, что Screen 1 должен открыть Fragment1, а Screen 2 – сайт. Проверим.
Открылся Fragment1 как вложенный экран. Сверху отображается полный путь вложенности. Вернуться можно кнопкой Назад. Таким образом, вы можете создавать вложенные экраны с настройками, не уходя от заголовков.
Нажатие на Screen 2 запустит браузер и откроет ссылку.
Нажатие на Header 3 откроет настройки экрана.
Если запустить это же приложение на планшете с Android 3.2, оно будет выглядеть так:
Если запустить, не на планшете, а на смартфоне с 4.1, то приложение само для себя каким-то образом решает, что разбить экран на две части здесь не получится и показывает заголовки на одном экране
а содержимое на другом
Чтобы программно определить, будет экран делиться на две части или нет, можно использовать метод isMultiPane.
На следующем уроке:
— программно размещаем элементы в ActionBar
— используем элементы из фрагментов
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник