Android getsupportactionbar in fragment

GetSupportActionBar изнутри фрагмента ActionBarCompat

Я начинаю новый проект, который использует AppCompat/ActionBarCompat в библиотеке поддержки v7 . Я пытаюсь понять, как использовать getSupportActionBar изнутри фрагмента. Моя активность, которая содержит фрагмент, расширяет ActionBarActivity , но я не вижу подобного класса поддержки для фрагментов.

Из моего фрагмента

Страница Google для ее использования ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) говорит, что для фрагмента v4 не должно быть никаких изменений. Нужно ли использовать все мои getActivity() в ActionBarActivity ? Это похоже на плохой дизайн.

После Fragment.onActivityCreated (…) у вас будет действительная активность, доступная через getActivity (). Вам нужно будет передать его в ActionBarActivity, затем вызовите getSupportActionBar ().

Тебе нужен актерский состав. Это не плохой дизайн, это обратная совместимость.

Хотя этот вопрос уже принят, я должен указать, что это не совсем правильно: вызов getSupportActionBar() из Fragment.onAttach() вызовет NullPointerException когда действие будет повернуто.

Короткий ответ:

Используйте ((ActionBarActivity)getActivity()).getSupportActionBar() в onActivityCreated() (или любой момент после этого в своем жизненном цикле) вместо onAttach() .

Длительный ответ:

Причина в том, что если ActionBarActivity воссоздается после вращения, он восстанавливает все фрагменты, прежде чем создавать объект ActionBar .

Исходный код для ActionBarActivity в библиотеке support-v7 :

  • ActionBarActivityDelegate.createDelegate() создает объект mImpl зависимости от версии Android.
  • super.onCreate() – FragmentActivity.onCreate() , который восстанавливает любые предыдущие фрагменты после вращения ( FragmentManagerImpl.dispatchCreate() , & c).
  • mImpl.onCreate(savedInstanceState) – ActionBarActivityDelegate.onCreate() , который считывает переменную mHasActionBar из стиля окна.
  • Прежде чем mHasActionBar будет правдой, getSupportActionBar() всегда будет возвращать значение null .

Источник для ActionBarActivityDelegate.getSupportActionBar() :

Если кто-то использует com.android.support:appcompat-v7: и AppCompatActivity как активность, то это будет работать

В вашем fragment.xml добавить тег Toolbar из библиотеки поддержки

Теперь, как мы можем контролировать это из класса MyFragment ? Посмотрим

Внутри функции onCreateView добавить следующее

И если вы хотите добавить items на панель инструментов в MyFragment вы must добавить эту строку внутри функции onCreateView

Эта строка важна, если вы ее забудете, андроид не заполнит ваши пункты меню.

Предположим, что мы идентифицируем их в menu/fragment_menu.xml

После этого отмените следующие функции

надеюсь это поможет

В качестве обновленного ответа на вопрос Пьера-Антуана Лафайета

ActionBarActivity устарела; Вместо этого используйте AppCompatActivity

Источник

getSupportActionBar изнутри фрагмента ActionBarCompat

Я начинаю новый проект, который использует AppCompat/ActionBarCompat на v7 библиотека поддержки. Я пытаюсь понять, как использовать getSupportActionBar изнутри фрагмент. Моя активность, в которой находится фрагмент, расширяется ActionBarActivity , но я не вижу аналогичного класса поддержки для фрагментов.

из моего фрагмента

страница google для ее использования (http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html) говорит, что должен никаких изменений для v4 фрагмент. Мне нужно бросить все мои getActivity() звонки ActionBarActivity ? Это кажется плохим дизайном.

5 ответов

после фрагмент.onActivityCreated(. ) у вас будет действительное действие, доступное через getActivity ().

вам нужно будет привести его к ActionBarActivity затем сделать вызов getSupportActionBar ().

вам нужен бросок. Это не плохой дизайн, это обратная совместимость.

Читайте также:  Резервное копирование андроид самсунг а50

хотя этот вопрос уже имеет принятый ответ, я должен отметить, что это не совсем правильно: вызов getSupportActionBar() С Fragment.onAttach() вызывает NullPointerException при вращении действия.

короткий ответ:

использовать ((ActionBarActivity)getActivity()).getSupportActionBar() на onActivityCreated() (или любой момент после этого в его жизненном цикле) вместо onAttach() .

ответ:

причина в том, что если ActionBarActivity воссоздается после вращение, оно восстановит все фрагменты до создание

Если кто-то использует com.андроид.поддержка: appcompat-v7: и AppCompatActivity как активность, то это будет работать

в своем fragment.xml добавить Toolbar тег из библиотеки поддержки

теперь, как мы можем управлять им с MyFragment класса? посмотрим!—14—>

внутри onCreateView функция добавить следующее

и если вы хотите добавить items на панели инструментов MyFragment вы must добавьте следующую строку внутри onCreateView функции

эта строка важна, если вы ее забудете, android не будет заполнять ваши пункты меню.

предположим, мы идентифицируем их в menu/fragment_menu.xml

после этого переопределите следующие функции

надеюсь, что это помогает

как обновленный ответ для ответа Пьера-Антуана Лафайета

Источник

Вызов setSupportActionBar во фрагменте

Как я могу назвать setSupportActionBar во фрагменте на языке котлин. У меня есть mainActivity с навигационным ящиком. Когда я нажимаю на первый элемент навигационного ящика, он должен открыть фрагмент notesFragment. Я хочу установить панель инструментов для notesFragment. Когда я пытался использовать AppCompatActivity().setSupportActionBar(toolbar_top) , приложение вылетает, когда я нажимаю на первый элемент навигационного ящика, с ошибкой

java.lang.NullPointerException: попытка вызвать виртуальный метод ‘android.view.Window $ Callback android.view.Window.getCallback ()’ для ссылки на пустой объект

3 ответа

Поскольку вы используете Kotlin, вы можете попытаться преобразовать действие в AppCompatActivity, а затем получить доступ к панели действий поддержки:

Обратите внимание, что это будет работать, только если ваша деятельность хоста расширяет AppCompatActivity.

В документации AppCompatActivity говорится, что getSupportActionBar() это метод экземпляра. Выполняя AppCompatActivity().setSupportActionBar(toolbar) , вы вызываете конструктор без присвоения ссылки на переменную, а затем ожидаете, что этот экземпляр вызовет метод, аналогично тому, что было бы статическим методом. Это не так. К настоящему моменту вы должны начать понимать, что по тому, как вы делаете что-то, вы не ссылаетесь на активность своего хоста, поэтому попытка установить панель инструментов не будет работать, даже если синтаксис был правильным.

Что касается фрагмента, вы получаете экземпляр активности хостинга через его activity член. activity.supportActionBar нет, потому что он был заключен для вас в activity.actionBar .

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

Также в самых последних версиях библиотеки поддержки, где свойство Activity имеет тип NULL, вы можете использовать безопасный вызов:

Источник

Урок 13. Работа с Toolbar и menu на примере UserInfoActivity

Код начала урока:

Знакомство с элементом Toolbar

Элемент Toolbar предназначен для быстрого и удобного доступа пользователя к часто используемым функциям. Создать его можно используя как упрощённый вариант, в котором о многом уже позаботились разработчики системы Android , так и полностью управляя всеми внутренними компонентами. В данном уроке мы рассмотрим упрощённый вариант.

На главном экране приложения с детальной информацией о пользователе нам необходимо создать такой toolbar :

Читайте также:  Лифан цебриум 720 андроид

Здесь у нас находится только один элемент: кнопка поиска, которая должна перенаправлять нас на экран для поиска других пользователей.

В ранних версиях Android использовался элемент ActionBar , теперь же его функцию выполняет Toolbar . Важно, использовать Toolbar из пакета android.support.v7.widget , чтобы у нас была совместимость со старыми устройствами (версия Android ниже 5.0).

Поэтому сперва нам необходимо позаботиться о том, чтобы наши экраны не содержали элемент ActionBar по умолчанию. Для этого нам нужно унаследовать главный стиль приложения (находится в файле styles.xml ) от необходимого нам Theme.AppCompat.Light.NoActionBar :

Теперь необходимо добавить элемент Toolbar в xml -файл activity_user_info.xml . Для этого добавим Toolbar над контейнером RelativeLayout , в котором находится вся информация о пользователе. Также добавим стиль для тулбара, чтобы переиспользовать его на других экранах.

Атрибуты элемента Toolbar

Остановимся на некоторых атрибутах:

  • «android:layout_height»>?attr/actionBarSize . Здесь мы указываем высоту тулбара. Таким синтаксисом мы можем получить доступ к значению высоты, которая применяется в атрибутах темы. По умолчанию, если мы не переопределяем значение, оно берётся из системного пакета темы support . Это значение лучше использовать, т.к. оно соответствует гайдам дизайна от Google . Подробнее можете изучить на сайте официальной документации.
  • theme>@style/ThemeOverlay.AppCompat.Dark.ActionBar . Мы пока закомментировали этот атрибут. Объясним его чуть позже более наглядно.

Таким образом, мы добавили в нашу Activity тулбар. Но этого мало. Нам нужно сообщить ей, что мы используем его в качестве замены элемента ActionBar . Это необходимо, чтобы на устройствах со старой версией Android (ниже Android 5.0 (API 21)) наш интерфейс выглядел также, как и на устройства с новой версией. Для этого нам просто нужно вызвать метод Activity setSupportActionBar(Toolbar toolbar) :

Важно, чтобы импорт вашего тулбара выглядел так: import android.support.v7.widget.Toolbar; . Именно тулбар из этого пакета нам и нужен.

Давайте запустим приложение и посмотрим, что получилось:

Видим, что текст в нашем тулбаре отображается тёмным цветом. Это потому что наше приложение по умолчанию использует Light тему Theme.AppCompat.Light.NoActionBar . Эта тема означает, что фоновый цвет будет светлым, а текст – тёмным.

Давайте раскомментируем атрибут тулбара, который указывает, что все его вложенные элементы должны использовать тему Dark . В тёмной теме весь текст будет отображать светлым цветом, а фоновый цвет – тёмным. Помним, что фоновый цвет тулбара мы тоже переопределяем, используя атрибут android:background .

Запустим приложение, посмотрим, что получилось:

Отлично, двигаемся дальше.

Осталось наполнить наш toolbar содержимым. Т.к. нашему тулбару необходима всего одна кнопка поиска, то мы можем обойтись стандартным способом добавления элементов в тулбар: при помощи Menu (помимо примера ниже также можете ознакомиться с данным уроком).

Скачивание png иконки

Давайте вначале скачаем иконку поиска, которая будет отображаться в menu . Как правило, для создания приложения достаточно пользоваться ресурсами, которые уже для разработчиков подготовил Google. Например, такая ситуация с иконками, которые рекомендует использовать Google. Их можно найти на этом сайте. В данном случае нам необходима иконка поиска, поэтому попробуем её найти, введя в поле поиска search :

Читайте также:  Ворд для андроид крякнутый

Нашли подходящую иконку, выбрали в выпадающем списке тип Android и цвет, а теперь можем скачать .png -файлы. В первую очередь извлекаем архив для удобной работы с файлами. После извлечения архива видим, что в папке res содержится иконка промасштабированная для различных разрешений экранов, поэтому в зависимости от разрешения экрана устройство самостоятельно будет использовать наиболее подходящий ресурс для отображения.

Наша задача – обеспечить приложение иконками для разных разрешений. Подробнее об этом можно почитать в официальной документации.

Таким образом выделяем все папки внутри res ( drawable-hdpi , drawable-xhdpi и т.д.), копируем их, потом заходим в проект и вставляем их в папку res нашего приложения. После добавления иконок структура проекта выглядит так:

Т.е. мы скопировали несколько иконок для разных размеров экранов.

Если поменяем тип отображения файлов с Android на Project , то увидим, что физически создалось несколько папок, в каждой из которых лежит png для разного разрешения экрана.

Создание menu

Как мы с вами помним, для создания папки ресурсов menu необходимо нажать правой кнопкой по папке res и выбрать New -> Android resource directory . В появившемся диалоговом окне выбираем Resource type – menu . Все остальные поля заполнятся автоматически такими же значениями:

Нажимаем OK и видим, что папка создалась.

Затем создадим новый файл меню. Для этого правой кнопкой кликаем по папке menu и выбираем варианты New -> Menu resource file . Вводим имя user_info_menu.xml :

Из данного xml -файла можно увидеть, что наша иконка поиска будет всегда видна пользователю ( app:showAsAction=»always» ). Видим, что мы ссылаемся на иконку, которую только что добавили в проект ( android:icon=»@drawable/ic_search_white_24dp» ).

Теперь мы можем наполнить содержимым наш Toolbar , переопределив метод onCreateOptionsMenu в Activity . Это стало возможным благодаря тому, что мы вызвали метод setSupportActionBar(toolbar) .

Чтобы переопределить какой-то из методов мы можем нажать комбинацию клавиш Ctrl + O . После этого появится окно со всеми методами. Мы можем ввести название метода onCreateOptionsMenu . И выбрать его:

Давайте добавим в метод использование user_info_menu :

Отлично, дело за малым: выполнить необходимое нам действие по клику на кнопку – перейти на экран для поиска пользователей:

Единственная вещь, о которой ещё стоит упомянуть – это установка заголовка нашего экрана, отображающегося в тулбаре. Мы хотим устанавливать имя пользователя динамически в методе displayUserInfo . Для этого достаточно вызвать в необходимом месте метод тулбара setTitle(CharSequence title) . Помните, что мы вызывали строку setSupportActionBar(toolbar) . Также в Activity есть метод getSupportActionBar , который используется для совместимости со старыми устройствами. Его мы и будем использовать. Давайте добавим эту логику в метод displayUserInfo() :

AndroidStudio может подчёркивать вызов getSupportActionBar().setTitle , сообщая, что объект может быть null . Но мы помним, что мы вызвали метод setSupportActionBar(toolbar) , поэтому можем пока игнорировать это замечание.

Запустим приложение и посмотрим на результат:

В результате данного урока мы узнали:

  • что такое элемент Toolbar ;
  • что такое Menu и как его использловать с элементом Toolbar ;
  • каким образом наполнить Toolbar пользовательскими элементами.

Источник

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