В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Когда вы используете android:background
, вы заменяете большую часть стиля и внешнего вида кнопки с пустым цветом.
Обновление: Начиная с версии версии 23.0.0 из AppCompat , существует новый стиль Widget.AppCompat.Button.Colored
, который использует вашу тему colorButtonNormal
для отключенного цвета и colorAccent
для включенного цвета.
Это позволяет применить его к вашей кнопке напрямую через
<Button
...
style="@style/Widget.AppCompat.Button.Colored" />
. Если вам нужны пользовательские colorButtonNormal
или colorAccent
, вы можете использовать ThemeOverlay
, как описано в этот прокончик и android:theme
на кнопке.
Предыдущий ответ
Вы можете использовать вытаскиваемый в вашем каталоге v21 для вашего фона, например:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item android:drawable="?attr/colorPrimary"/>
</ripple>
Это гарантирует, что цвет фона будет ?attr/colorPrimary
и будет иметь анимацию пульсации по умолчанию, используя значение по умолчанию ?attr/colorControlHighlight
(которое вы также можете установить в своей теме, если хотите).
Примечание: вам нужно создать настраиваемый селектор меньше, чем v21:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/primaryPressed" android:state_pressed="true"/>
<item android:drawable="@color/primaryFocused" android:state_focused="true"/>
<item android:drawable="@color/primary"/>
</selector>
Предполагая, что у вас есть некоторые цвета, которые вы хотели бы использовать по умолчанию, нажатию и сфокусированному состоянию. Лично я сделал скриншот рябь на полпути, выбрав ее, и вытащил из нее основное / сфокусированное состояние.
Если вас интересует ImageButton, вы можете попробовать эту простую вещь:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_button"
android:background="?attr/selectableItemBackgroundBorderless"
/>
<android.support.v7.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:backgroundTint="#fff"
android:textColor="#000"
android:text="test"/>
Используйте
xmlns:app="http://schemas.android.com/apk/res-auto"
, и цвет примет на предварительном леллипопе
v22.1
of appcompat-v7
ввел некоторые новые возможности. Теперь можно назначить конкретную тему только одному виду.
Устаревшее использование приложения: тема для стилизации панели инструментов. Теперь вы можете использовать андроид: тему для панелей инструментов на всех устройствах уровня API 7 и выше и поддержку андроидов: тема для всех виджетов на устройствах уровня 11 и выше.
blockquote>Таким образом, вместо того, цвет в глобальной теме, мы создаем новый и присваиваем его только
Button
Пример:
<style name="MyColorButton" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorButtonNormal">@color/myColor</item> </style>
И используйте этот стиль в качестве темы вашего
Button
<Button style="?android:attr/buttonStyleSmall" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Button1" android:theme="@style/MyColorButton"/>
Сегодня я столкнулся с этой проблемой, фактически играя с библиотекой v22.
Предполагая, что вы используете стили, вы можете установить свойство colorButtonNormal
, и кнопки будут использовать этот цвет по умолчанию.
<style name="AppTheme" parent="BaseTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/primaryColor</item>
<item name="colorPrimaryDark">@color/primaryColorDark</item>
<item name="colorAccent">@color/accentColor</item>
<item name="colorButtonNormal">@color/primaryColor</item>
</style>
Помимо этого вы все равно можете создать стиль для кнопки, а затем использовать это для каждой кнопки, если вам нужен набор цветов (не тестировались, просто спекулировали).
Не забудьте добавить android:
перед именами элементов в вашем стиле v21 .
Ответ @ ianhanniballake абсолютно правильный и прост. Но мне потребовалось несколько дней, чтобы понять. Для тех, кто не понимает его ответа, здесь более подробно реализовано
<Button
android:id="@+id/btn"
style="@style/MaterialButton"
... />
<style name="MaterialButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:theme">@style/Theme.MaterialButton</item>
...
</style>
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
=== Или ===
<Button
android:id="@+id/btn"
style="@style/Widget.AppCompat.Button.Colored"
android:theme="@style/Theme.MaterialButton" />
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
colorButtonNormal
в базовой теме @style/AppTheme
. Это дает цвет по умолчанию для AppCompat, чтобы соответствующим образом раскрасить кнопки. А затем можно использовать свой ответ на тему в отдельности.
– Siddharth Pant
29 January 2016 в 21:05
android:theme="Theme.MaterialButton"
или android:theme="@style/Theme.MaterialButton"
– osrl
14 November 2016 в 14:23
android:theme="@style/Theme.MaterialButton"
. Спасибо за вашу правильность.
– Frank Nguyen
8 December 2017 в 02:55
Если вам нравится использовать стороннюю библиотеку, проверьте traex / RippleEffect . Это позволяет добавить эффект Ripple в ANY view с помощью всего нескольких строк кода. Вам просто нужно обернуть в вашем файле макета xml элемент, который вы хотите иметь эффект пульсации с контейнером com.andexert.library.RippleView
.
В качестве дополнительного бонуса он требует Min SDK 9, поэтому вы можете иметь согласованность дизайна в версиях ОС.
Вот пример, взятый из репликации библиотек GitHub:
<com.andexert.library.RippleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:rv_centered="true">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@android:drawable/ic_menu_edit"
android:background="@android:color/holo_blue_dark"/>
</com.andexert.library.RippleView>
Вы можете изменить цвет пульсации, добавив этот атрибут в элемент RippleView: app:rv_color="@color/my_fancy_ripple_color
Я пришел в это сообщение, ища способ иметь цвет фона моего пункта ListView
, но сохраняю рябь.
Я просто добавил свой цвет в качестве фона и selectableItemBackground в качестве переднего плана :
<style name="my_list_item">
<item name="android:background">@color/white</item>
<item name="android:foreground">?attr/selectableItemBackground</item>
<item name="android:layout_height">@dimen/my_list_item_height</item>
</style>
, и это работает как шарм. Я предполагаю, что тот же метод можно использовать и для кнопок. Удачи:)
Вот простой и обратный совместимый способ доставить эффект пульсации на поднятые кнопки с пользовательским фоном.
Ваш макет должен выглядеть следующим образом:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_custom_background"
android:foreground="?android:attr/selectableItemBackground"/>
foreground
не действует до 23. google.com/…
– androidguy
1 December 2016 в 09:18
Существует еще одно простое решение для создания настраиваемого фона для кнопок «Плоский», сохраняя при этом их «материальные» эффекты.
т.е. :
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/blue">
<Button
style="?android:attr/buttonStyleSmall"
android:background="?android:attr/selectableItemBackground"
android:textColor="@android:color/white"
android:textAllCaps="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button1"
/>
</FrameLayout>
Может использоваться для кнопок Flat , он работает с API> = 11, и вы получите эффект пульсации на> = 21 устройствах, сохраняя регулярные кнопки на предустановке -21 до AppCompat обновляется, чтобы поддерживать там пульсацию.
Вы также можете использовать selectableItemBackgroundBorderless только для кнопок = =.
В великом учебнике объясняются два подхода: Алекс Локвуд: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :
Подход # 1: изменение цвета фона кнопки с ThemeOverlay
<!-- res/values/themes.xml -->
<style name="RedButtonLightTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/googred500</item>
</style>
<Button
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:theme="@style/RedButtonLightTheme"/>
Подход # 2: установка фонового оттенка AppCompatButton
<!-- res/color/btn_colored_background_tint.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Disabled state. -->
<item android:state_enabled="false"
android:color="?attr/colorButtonNormal"
android:alpha="?android:attr/disabledAlpha"/>
<!-- Enabled state. -->
<item android:color="?attr/colorAccent"/>
</selector>
<android.support.v7.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:backgroundTint="@color/btn_colored_background_tint"/>
Программное применение цветов:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
ColorStateList colorStateListRipple = new ColorStateList(
new int[][] {{0}},
new int[] {Color.WHITE} // ripple color
);
RippleDrawable rippleDrawable = (RippleDrawable) myButton.getBackground();
rippleDrawable.setColor(colorStateListRipple);
myButton.setBackground(rippleDrawable); // applying the ripple color
}
ColorStateList colorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed}, // when pressed
new int[]{android.R.attr.state_enabled}, // normal state color
new int[]{} // normal state color
},
new int[]{
Color.CYAN, // when pressed
Color.RED, // normal state color
Color.RED // normal state color
}
);
ViewCompat.setBackgroundTintList(myButton, colorStateList); // applying the state colors
С AppCompat (22.1.1+) вы можете добавить такой стиль:
<style name="MyGreenButton">
<item name="colorButtonNormal">#009900</item>
</style>
И использовать его, просто применяя стиль:
<android.support.v7.widget.AppCompatButton
style="@style/MyGreenButton"
android:layout_width="match_width"
android:layout_height="wrap_content"
android:text="A Green Button"
/>
Программно изменяя цвет, я обнаружил, что единственный способ обновить цвет (на API 15 или 16) - это использовать вместо этого «список оттенков фона». И он не удаляет симпатичную радиальную анимацию на устройствах API 21:
ColorStateList colorStateList = new ColorStateList(new int[][] {{0}}, new int[] {0xFF009900}); // 0xAARRGGBB
button.setSupportBackgroundTintList(colorStateList);
Поскольку button.setBackground(...)
и button.getBackground().mutate().setColorFilter(...)
не меняют цвет кнопки на API 15 и 16, как на API 21 .
ColorStateList.valueOf( ... )
для создания простого ColorStateList
только одного цвета.
– Taig
5 September 2016 в 13:32
ViewCompat.setBackgroundTintList(myButton, ColorStateList.valueOf(myColor);
Javadoc для setSupportBackgroundTintList
говорит, что его следует называть таким образом.
– JerabekJakub
24 November 2017 в 10:45
Я попробовал это:
android:backgroundTint:"@color/mycolor"
вместо изменения свойства фона. Это не устраняет материальный эффект.
Я использовал backgroundTint и переднего плана:
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
android:backgroundTint="@color/colorAccent"
android:foreground="?android:attr/selectableItemBackground"
android:textColor="@android:color/white"
android:textSize="10sp"/>