- разница между приложением: popupTheme and android: theme [duplicate]
- Что вы должны знать о this
- Как сделать обратитесь к правильному this
- Не используйте this
- Явно установить this обратного вызова — часть 1
- ECMAScript 6: Используйте функции стрелок
- Установите this обратного вызова — часть 2
- Общая проблема: использование объектных методов в качестве обработчиков обратных вызовов / событий
- Овладение Coordinator Layout
- CoordinatorLayout
- AppBarLayout
- Флаги AppbarLayout
- CoordinatorLayout Behaviors
- SwipeDismissBehavior
- Custom Behaviors
- Child и dependency
- Русские Блоги
- Android ToolBar использует полное разрешение
- 1. Введение в панель инструментов
- Основное использование ToolBar
- Представьте пакет поддержки v7
- Сменить тему
- Создайте этот элемент управления в файле макета. В файле activity_main.xml код выглядит следующим образом:
- ToolBar совершенство
- Во-первых, мы сначала рассмотрим изменение цвета панели инструментов
- Во-вторых, добавьте заголовок, субтитры, логотип, значки панели навигации
- В-третьих, добавьте значки меню и нажмите события
- 1. Добавить значок опции меню
- 2. Добавить событие клика
- 4. Другие модификации стиля
- Изменить стиль всплывающего меню панели инструментов
- Изменить позицию всплывающего меню всплывающего меню панели инструментов
- Во-вторых, добавить значки в меню панели инструментов
разница между приложением: popupTheme and android: theme [duplicate]
Что вы должны знать о this
this (иначе говоря, «контекст») — это специальное ключевое слово внутри каждой функции, и его значение зависит только от , как была вызвана функция, а не как / когда / где она была определена. Лексические области не затрагиваются, как и другие переменные. Вот несколько примеров:
Чтобы узнать больше о this , просмотрите документацию MDN .
Как сделать обратитесь к правильному this
Не используйте this
Фактически вы не хотите иметь доступ к this в частности, но объект, на который он ссылается на . Вот почему простое решение — просто создать новую переменную, которая также относится к этому объекту. Переменная может иметь любое имя, но общие — self и that .
Поскольку self является нормальной переменной, она подчиняется лексическим правилам области и доступна внутри обратного вызова. Это также имеет то преимущество, что вы можете получить доступ к значению this самого обратного вызова.
Явно установить this обратного вызова — часть 1
Возможно, у вас есть не контролируйте значение this , потому что его значение устанавливается автоматически, но на самом деле это не так.
Каждая функция имеет метод .bind [docs] , который возвращает новую функцию с this , привязанную к значению. Функция имеет то же поведение, что и тот, который вы назвали .bind , только то, что this было установлено вами. Независимо от того, как и когда эта функция вызывается, this всегда будет ссылаться на переданное значение.
В этом случае мы привязываем обратный вызов this к значению MyConstructor ‘s this .
Примечание. При связывании контекста для jQuery вместо этого используйте jQuery.proxy [docs] . Причина этого заключается в том, что вам не нужно сохранять ссылку на функцию при отмене обратного вызова события. jQuery обрабатывает это внутренне.
ECMAScript 6: Используйте функции стрелок
В ECMAScript 6 представлены функции стрелок , которые можно рассматривать как лямбда-функции. У них нет собственной привязки this . Вместо этого this просматривается в области видимости как обычная переменная. Это означает, что вам не нужно называть .bind . Это не единственное особое поведение, которое у них есть. Дополнительную информацию см. В документации MDN.
Установите this обратного вызова — часть 2
Некоторые функции / методы, которые принимают обратные вызовы, также принимают значение, к которому должен обращаться обратный вызов this . Это в основном то же самое, что и привязывать его самостоятельно, но функция / метод делает это за вас. Array#map [docs] — такой метод. Его подпись такова:
Первый аргумент — это обратный вызов, а второй аргумент — значение this . Вот надуманный пример:
Примечание. Можно ли передать значение для this , как правило, упоминается в документации этой функции / метода. Например, метод $.ajax jQuery [docs] описывает параметр, называемый context :
Этот объект станет контекстом всех обратных вызовов, связанных с Ajax.
Общая проблема: использование объектных методов в качестве обработчиков обратных вызовов / событий
Еще одно распространенное проявление этой проблемы — когда объектный метод используется как обработчик обратного вызова / события , Функции являются первоклассными гражданами в JavaScript, а термин «метод» — просто разговорный термин для функции, которая является значением свойства объекта. Но эта функция не имеет конкретной ссылки на ее «содержащий» объект.
Рассмотрим следующий пример:
Функция this.method назначается как обработчик события click , но если щелкнуть document.body , зарегистрированное значение будет undefined , потому что внутри обработчика события this ссылается на document.body , а не на экземпляр Foo . Как уже упоминалось в начале, то, что относится к [49], зависит от того, как называется функция, а не от того, как она определена. Если код выглядит следующим образом, может быть более очевидно, что функция не имеет неявной ссылки на объект:
Решение такое же, как указано выше: если доступно, используйте .bind явно привязать this к определенному значению
или явно вызвать функцию как «метод» объекта, используя анонимную функцию в качестве обработчика обратного вызова / события и назначить object ( this ) к другой переменной:
или использовать функцию стрелки:
Источник
Овладение Coordinator Layout
На презентации Google I/O 15, компания Google представила новую версию библиотеки поддержки которая реализует несколько компонентов, сильно связанных со спецификациями Material Design, среди этих компонентов вы можете найти новые типы ViewGroup такие как AppbarLayout , CollapsingToolbarLayout и CoordinatorLayout .
При правильном комбинировании и настройке данные Viewgroup могут быть очень мощным инструментом, по этому я решил написать статью с некоторыми настройками и советами.
CoordinatorLayout
Как и предполагает его название, цель и философия этой ViewGroup является координация view элементов, которые находятся внутри него.
Рассмотрим следующую картинку:
В этом примере можем видеть как view элементы размещены друг относительно друга, не прибегая к детальному просмотру, мы видим как одни View зависят от других. (мы поговорим об этом позже).
Это будет простейшая структура использования CoordinatorLayout :
Рассмотрим скелет данного layout. У этого CoordinatorLayout имеется только три дочерних элемента: AppbarLayout , прокручиваемый view и закрепленный FloatingActionBar .
AppBarLayout
Проще говоря, AppBarLayout это LinearLayout на стероидах, их элементы размещены вертикально, с определенными параметрами элементы могут управлять их поведением, когда содержимое прокручивается.
Это может прозвучать запутано сначала, но как, — «Лучше один раз увидеть, чем сто раз услышать», к вашему вниманию .gif-пример:
В данном случае AppBarLayout это синяя view, размещенная под исчезающим изображением, она содержит Toolbar , LinearLayout с заголовком и подзаголовком и TabLayout с несколькими вкладками.
Мы можем управлять поведением элементов AppbarLayout с помощью параметров: layout_scrollFlags . Значение: scroll в данном случае присутствует почти во всех элементах view, если бы этот параметр не был указан ни в одном из элементов AppbarLayout, он остался бы неизменным, позволяя прокручиваемому контенту проходить позади него.
Со значением: snap , мы избегаем попадания в полу-анимационного-состояния, это значит, что анимация всегда скрывает или отображает полный размер view.
LinearLayout который содержит заголовок и подзаголовок будет всегда отображен при прокручивании вверх, ( enterAlways значение), и TabLayout будет видим всегда так как на него не установлен ни один флаг.
Как видите настоящая мощь AppbarLayout определяется должным управлением его флагами прокрутки в определенных view.
Все эти параметры доступны в документации Google Developers. В любом случае, я рекомендую поиграть с примерами. В конце статьи размещены ссылки на репозитории Github с реализацией примеров.
Флаги AppbarLayout
SCROLL_FLAG_ENTER_ALWAYS : При использовании флага, view будет прокручиваться вниз не зависимо от других прокручиваемых view.
SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED : Дополнительный флаг для ‘enterAlways’, который изменяет возвращаемый view к изначально прокручиваемому, при исчезновении высоты.
SCROLL_FLAG_EXIT_UNTIL_COLLAPSED : При выходе, view будет прокручен до тех пор пока не исчезнет.
SCROLL_FLAG_SCROLL : Элемент view будет прокручиваться в направлении события прокрутки.
SCROLL_FLAG_SNAP : В конце прокрутки, если view видим только частично, он будет докручен до его ближайшего края.
CoordinatorLayout Behaviors
Проведем не большой эксперимент, запустим Android Studio (>= 1.4) и создадим проект из шаблона: Scrolling Activity, ничего не изменяя, компилирием и вот что мы видим:
При рассмотрении сгенерированного кода, ни макеты layout ни java классы не имеют ничего относящегося к маштабированию анимации плавающей кнопки при прокрутке. Почему?
Ответ находится в исходном коде FloatingActionButton , с тех пор как Android Studio v1.2 включает java декомпилятор, с помощью ctrl/cmd + click мы можем проверить исходный код и посмотреть что происходит:
За маштабирование анимации отвечает новый элемент, представленый вместе с design library, под названием Behavior . В данном случае , который зависит от некоторых факторов включая прокрутку, показывать FAB или нет, интересно, не правда ли?
SwipeDismissBehavior
Продолжим углубление в код, если вы посмотрите внутрь пакета виджетов design support library, то сможете найти открытй клас под названием: SwipeDismissBehavior . С этим новым Behavior мы можем очень легко реализовать функцию свайп для отмены в наших шаблонах с CoordinatorLayout :
Custom Behaviors
Создать свой шаблон поведения (Behavior) не так и сложно как может показаться, для начала мы должны принять во внимание несколько основных элементов: child и dependency.
Child и dependency
child это элемент который усиливает поведение, dependency — тот кто будет обслуживать его как тригер для взаимодействия с child элементом. Посмотрим на пример, child — элемент ImageView, а dependency это Toolbar, таким образом, если Toolbar движется, ImageView тоже движется.
Теперь, когда мы определили концепт, можем поговорить о реализации, первым шагом будет наследование от:
, значение T будет класс который принадлежит view, что необходим нам для координации, в данном случае ImageView, после чего мы должны переопределить следующие методы:
- layoutDependsOn
- onDependentViewChanged
Метод: layoutDependsOn будет вызван каждый раз когда что-то случится в layout, чтобы вернуть true , как только мы определили dependency, в примере, этот метод срабатывает автоматически при прокручивании (т.к. Toolbar будет двигаться), таким образом, мы можем подать знак нашему child отреагировать соответствующим образом.
Всякий раз когда layoutDependsOn возвращает true будет вызван второй onDependentViewChanged . Вот тут-то мы и должны реализовать нашу анимацию, перевод или движения всегда зависят от предоставленной зависимости.
Источник
Русские Блоги
Android ToolBar использует полное разрешение
До API 21 мы использовали строку заголовка в основном в ActionBarActivity Activity, и После API 21 Google отказался от ActionBarActivity и рекомендовал AppCompatActivity.
1. Введение в панель инструментов
ToolBar — это новый элемент управления навигацией, представленный в Android 5.0 для замены предыдущего ActionBar.В связи с его высокой настраиваемостью, гибкостью и преимуществами стиля дизайна материалов, все больше и больше приложений также используют ToolBar, такие как обычно используемые Зная программное обеспечение, верхняя панель навигации использует панель инструментов. Официальные лица считают, что есть еще пользователи, чья версия мобильного телефона ниже 5.0, поэтому ToolBar также включен в пакет поддержки v7, так что нижняя версия системы также может использовать ToolBar. В этой статье для объяснения будет использоваться панель инструментов пакета поддержки support v7, включая его базовое использование, настройку стиля и другие вопросы.
Основное использование ToolBar
Представьте пакет поддержки v7
Введите следующий код в build.gradle вашего проекта, вы можете представить пакет поддержки, который имеет панель инструментов, обратно совместимую:
Сменить тему
Чтобы иметь возможность использовать панель инструментов в обычном режиме, нам нужно скрыть оригинальный ActionBar. Это можно изменить в теме. В файл values / styles.xml необходимо внести следующие изменения:
Унаследованная тема Theme.Appcompat.Light.NoActionBar, здесь упоминается, этот Theme.AppCompat является темой в пакете поддержки, соответствующей версии 5.0 темы Theme.Material версии 5.0. Затем обратитесь к этой теме в файле манифеста.
Создайте этот элемент управления в файле макета. В файле activity_main.xml код выглядит следующим образом:
В приведенном выше примере создается android.support.v7.widget.Toolbar, и мы помещаем TextView внутрь, что является самым большим отличием от ActionBar, потому что ToolBar на самом деле является ViewGroup, которая поддерживает размещение дочернего View внутри него. Хорошо, мы запускаем программу и получаем следующий результат:
Видно, что панель инструментов отображается нормально. Конечно, это просто простейшее использование. Далее мы постепенно добавляем контент и стили, чтобы он выглядел более красивым и функциональным.
ToolBar совершенство
Во-первых, мы сначала рассмотрим изменение цвета панели инструментов
Изменить цвет панели инструментов очень просто, просто добавьте атрибут backgroud в файл макета, чтобы указать цвет, но для общего рассмотрения мы можем сделать это: Внести следующие изменения в файл values / styles.xml:
Затем в файле макета добавьте следующие атрибуты:
Таким образом, удобно использовать один и тот же цвет для каждой панели инструментов. Давайте сначала посмотрим на эффект:
Как вы можете видеть, цвет изменился. В то же время мы заметили, что цвет верхней строки состояния также изменился на темно-синий. Это связано с тем, что для создания верхней строки состояния добавлен атрибут «colorPrimaryDark». С этим изменением, используя эту функцию, мы можем легко добиться эффекта «погружения в строку состояния». Конечно, это относится только к Android 5.0 и выше. Если версия ниже, этот атрибут недействителен. Приложите картинку сюда (картинка изhttp://blog.csdn.net/bbld_/article/details/41439715):
В соответствии с инструкциями на картинке мы можем легко настроить наш стиль в файле styles.xml,Если вы хотите изменить цвет заголовка, субтитров и текста меню на панели инструментов, вы можете использовать атрибут «textColorPrimary»И так далее.
Во-вторых, добавьте заголовок, субтитры, логотип, значки панели навигации
Получите экземпляр элемента управления в файле MainActivity, а затем установите его с помощью ряда установленных методов. Код выглядит следующим образом:
Если вы хотите изменить размер шрифта, цвет и т. д. заголовка и подзаголовка, вы можете вызватьsetTitleTextColor 、 setTitleTextAppearance 、 setSubtitleTextColor 、 setSubtitleTextAppearance Эти API. Конечно, эти параметры поддерживаются для добавления непосредственно в макет xml, но пространство имен android: не используется, а настраивается пространство имен, как показано ниже:
В-третьих, добавьте значки меню и нажмите события
1. Добавить значок опции меню
Общая панель навигации будет иметь пункты меню с правой стороны. Конечно, панель инструментов также поддерживает пользовательские меню. Сначала мы изменим следующее в файле меню: res / menu / menu_main.xml:
Вот такой знакомый: app: showAsAction = «ifRoom» / «never», приложение — это пользовательское пространство имен, потому что наша деятельность наследует AppCompatActivity, является пакетом поддержки v7 и не является внутренней по отношению к собственному SDK, поэтому Вы не можете использовать Android: showAsAction, в противном случае будет сообщено об ошибке. Тогда, если Room показывает, что есть место, оно показывает, никогда не означает никогда не показывать, но будет отображаться через overflowwindow.
Затем в Activity нам нужно переписать метод onCreateOptionsMenu (), чтобы загрузить это меню:
2. Добавить событие клика
С помощью меню нам нужно добавить событие щелчка в меню, чтобы меню имело практическое применение. Также очень удобно добавить событие щелчка. Вы можете сделать это:
Видно, что значок опции меню отображается нормально, и событие щелчка запускается нормально, но есть недостаток, то есть три точки в верхнем правом углу черные, что не соответствует значку значка. Есть ли способ изменить его? ? Ответ — да, это можно изменить, добавив стили следующим образом:
Атрибут «android: textColorSecondary» соответствует цвету трех точек в правом верхнем углу. После изменения он станет тем цветом, который вы хотите.
4. Другие модификации стиля
Изменить стиль всплывающего меню панели инструментов
Сначала мы нажимаем на три точки в верхнем правом углу, всплывающее меню, как показано ниже:
Вы можете видеть, что всплывающее меню в правом верхнем углу — это черный текст на белом фоне, так есть ли способ изменить его цвет фона, чтобы меню отображалось в виде белого текста на черном фоне? Ответ — да, мы можем установить это так:
Сначала создайте новую тему в файле styles.xml:
Можно видеть, что родительский объект этой темы напрямую унаследован от ThemeOverlay.AppCompat.Dark, который является темой пакета поддержки, и мы объявили свойство «android: colorBackground» внутри. Мы можем изменять цвет фона меню, пока мы меняем это свойство. а. Далее мы представляем эту тему в файле макета, который также очень прост. Добавьте дополнительные свойства на панель инструментов следующим образом:
Таким образом, цвет фона всплывающего меню можно изменить, изменив несколько строк кода, как показано ниже:
Изменить позицию всплывающего меню всплывающего меню панели инструментов
Мы видим, что позиция всплывающего меню слишком высока. Мы также можем изменить его положение так, чтобы оно находилось под панелью инструментов, что может выглядеть более красиво:
Измените файл styles.xml следующим образом:
Эффект заключается в следующем:
До сих пор были описаны соответствующие мнения об использовании панели инструментов. Видно, что панель инструментов обладает высокой гибкостью и может настраивать многие стили. Обычно мы разрабатываем разные стили, поэтому панель инструментов используется для замены панели действий. Очень подходит. Если в будущем появятся другие стили, я поделюсь ими, спасибо.
Во-вторых, добавить значки в меню панели инструментов
Чтобы реализовать новый интерфейс для дизайна продукта сегодня, вам нужно использовать элемент управления панели инструментов, поэтому вы начнете с ножа и сразу же напишите его:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
Используется в Activity: Activity требует расширения AppCompatActivity для переопределения метода onCreateOptionsMenu для загрузки макета меню
По умолчанию цвета шрифта заголовка и меню, а также другие значки меню являются черными. И меню покрывает панель инструментов, поэтому никакое меню не должно быть таким в текущем приложении. Потому что опыт действительно плохой. Как это изменить. Общее приложение выглядит так:
Стиль меню, установите цвет фона и запретите меню покрывать панель инструментов:
Цвет фона и проблемы покрытия были изменены. Но цвет шрифта панели инструментов и цвет значка, а также цвет шрифта меню слишком уродлив, продолжайте изменять: добавьте 2 строки кода в ToolbarPopupTheme, и вы можете сделать это:
Но значок в меню не может отображаться, решение:
Но шрифт белый и должен быть изменен на синий:
Я написал панель инструментов в интерфейсе фрагмента таким же образом, в Fragment нет метода setSupportActionBar (панель инструментов oolbar).
Меню фрагмента вышло. , , Но там нет иконки, на PrePareOptionsPanel (Просмотр, Меню)
После обнаружения, что у onCreateOptionsMenu (меню Menu, MenuInflater inflater) нет такого меню, как onPrepareOptionsPanel (представление View, меню Menu) ? ? ?
Источник