Api <21の場合、ボタンは正常に見えます。ただし、+ 21バージョンでは、下の画像に示されているこの境界線または影が作成されます。穴のテーマを変更せずにスタイル変数を設定せずにそれを取り除くにはどうすればよいですか?
この色付きの画像の方がはっきりしているかもしれません。ボタンの周りには何らかの境界線があります。
私のbuttonsstyleはこのように定義されています:
<style name="buttonTransparent" parent="Base.TextAppearance.AppCompat.Button">
<item name="Android:background">#00000000</item>
<item name="Android:textColor">@drawable/button_text_blue</item>
<item name="Android:textSize">18dp</item>
<item name="Android:textAllCaps">false</item>
<item name="Android:minHeight">45dp</item>
</style>
<style name="buttonLargeWhite" parent="buttonTransparent">
<item name="Android:background">#FFF</item>
<item name="Android:layout_marginTop">10dp</item>
</style>
LollipopにはstateListAnimator
と呼ばれる厄介な小さな機能があり、ボタンの標高を処理し、影につながります。
stateListAnimator
を削除して、影を取り除きます。
これを行うには、複数のオプションがあります。
Java:
button.setStateListAnimator(null);
Kotlin:
button.stateListAnimator = null
またはレイアウトxmlで:
<Button
...
Android:stateListAnimator="@null"
....
/>
私が使用している最も簡単な方法は、スタイル属性をボタンに設定することです
<Button
...
style="?android:attr/borderlessButtonStyle"
....
/>
将来必要になるかもしれません。
ボーダーがないように活用できるスタイルがすでにあります。
適用する
style="@style/Base.Widget.AppCompat.Button.Borderless"
あなたのアイテムにボーダーを削除します
「シャドウ」エフェクトがLollipop Appcompatテーマに追加されます
res/values-v21/styles.xmlに次の行を追加して、デフォルトのシャドウを削除します
テーマレベル:
<item name="Android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
xmlレイアウト:
Android:stateListAnimator="@null"
Java:
setStateListAnimator(null);
Kotlin:
stateListAnimator = null
これを修正しましたグローバルAndroid:stateListAnimator="@null"
でResources\values\styles.xml
を設定することで:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="AppTheme" parent="AppTheme.Base">
</style>
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<item name="Android:buttonStyle">@style/NoShadowButton</item>
</style>
<style name="NoShadowButton" parent="Android:style/Widget.Button">
<item name="Android:stateListAnimator">@null</item>
</style>
</resources>
そして出来上がった影は永久に消えてしまった:)
AndroidのボタンにはstatelistAnimatorプロパティがあるため、nullと宣言することでボタンの境界線を削除できます
Android:stateListAnimator="@null"
問題
From Android v21、すべてのボタンにボーダーがデフォルトで追加されました。
<!-- Bordered ink button -->
<style name="Widget.Material.Button">
<item name="background">@drawable/btn_default_material</item>
<item name="textAppearance">?attr/textAppearanceButton</item>
<item name="minHeight">48dip</item>
<item name="minWidth">88dip</item>
<item name="stateListAnimator">@anim/button_state_list_anim_material</item>
<item name="focusable">true</item>
<item name="clickable">true</item>
<item name="gravity">center_vertical|center_horizontal</item>
</style>
ソリューション
アプリケーションテーマでは、ボタンのスタイルを設定してデフォルトの境界線を削除します(Androidサポートライブラリ自体がスタイルを提供します)。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- From Android-v21 - Border has been added by default, hence we are removing it. -->
<item name="Android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
</style>
エレベーションを何も設定せずに、シャドウを完全に削除することをお勧めします。既にXMLスタイルがあるため(これを追加してこれを汎用的に使用する)、またはこの属性をXMLビュー定義に追加することができます
Android:elevation="0dp"
xmlで使用できます
Android:stateListAnimator="@null"
Kotlinでプログラムでこれを行いたい場合は、次のことができます。
button.stateListAnimator = null