現在、次のログインボタンがあります。
XMLは次のようになります
<LinearLayout
Android:background="?attr/welcomeBottomNavBarBackground"
Android:orientation="horizontal"
Android:id="@+id/sign_in_bottom_nav_bar"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true">
<Button
style="?android:attr/buttonBarButtonStyle"
Android:id="@+id/sign_in_button"
Android:layout_width="0dp"
Android:width="0dp"
Android:layout_weight="1.0"
Android:layout_height="48dp"
Android:gravity="center"
Android:layout_gravity="center"
Android:enabled="true"
Android:textAllCaps="true"
Android:text="@string/log_in" />
</LinearLayout>
ボタンが押されているときに、ボタンの周りのパディングを削除したい(または、マージンと呼ぶべきですか?一番下のp/sセクションを参照してください)。
試した
<Button
...
...
Android:minHeight="0dp"
Android:minWidth="0dp" />
機能せず、効果もありません。
さらに試してみる
<Button
...
...
Android:background="@null"
Android:minHeight="0dp"
Android:minWidth="0dp" />
押すとパディングがなくなります。ただし、押された視覚効果を設計した素材もなくなります。
押されたときにボタンのパディングを削除し、押された視覚効果を設計した素材を保持する最良の方法は何ですか?
私はそれをパディングまたはマージンと呼ぶべきかどうか本当に知りません。私が達成したいのは、下部の領域を押すと、プレスの視覚効果の変更が100%下部のバー領域全体に及ぶことです(@+id/sign_in_bottom_nav_bar
)、現在の95%の下部バー領域の代わりに。
標準ボタンは全幅で使用されることを想定していないため、これが発生します。
Material Design-Button Style を見ると、ボタンに48dpの高さのクリック領域があることがわかります。しかし、何らかの理由で36dpの高さとして表示されます。
これが表示される背景のアウトラインであり、ボタン自体の領域全体をカバーしません。
角は丸く、パディングがあり、それ自体がクリック可能で、コンテンツをラップし、画面の下部の幅全体に広がることは想定されていません。
上記のように、必要なのは異なるbackgroundです。標準のボタンではなく、この素敵な波及効果のある選択可能なアイテムの背景。
このユースケースには、?selectableItemBackground
背景に使用できるテーマ属性(特にリスト内)。
プラットフォームの標準リップル(または<21のカラー状態リスト)を追加し、現在のテーマカラーを使用します。
ユースケースには、次のものを使用できます。
<Button
Android:id="@+id/sign_in_button"
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Login"
Android:background="?attr/selectableItemBackground" />
<!-- /\ that's all -->
ビューが唯一のものであり、画面全体に広がる場合は、レイアウトの重みを追加する必要もありません
背景がどのように見えるかについて別のアイデアがある場合は、自分でカスタムドローアブルを作成し、そこで色と状態を管理する必要があります。
styles.xml
<style name="MyButtonStyle" parent="Base.Widget.AppCompat.Button">
<item name="Android:background">@drawable/selector</item>
<item name="Android:textColor">@Android:color/black</item>
</style>
values/drawable
:
my_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<shape Android:shape="rectangle" xmlns:Android="http://schemas.Android.com/apk/res/Android">
<corners Android:radius="2dp" />
<!-- specify your desired color here -->
<solid Android:color="#9e9b99" />
</shape>
selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:drawable="@drawable/my_drawable"/>
<item Android:state_pressed="true" Android:drawable="@drawable/my_drawable"/>
<item Android:drawable="@Android:color/transparent"/>
</selector>
values/drawable-v21
:
my_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<shape Android:shape="rectangle"
Android:tint="?attr/colorButtonNormal"
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<corners Android:radius="2dp" />
<solid Android:color="@Android:color/white" />
</shape>
selector.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<item Android:id="@Android:id/mask"
Android:drawable="@drawable/my_drawable" />
</ripple>
レイアウト内:
<Button
Android:id="@+id/button"
style="@style/MyButtonStyle"
Android:layout_width="match_parent"
Android:layout_height="100dp"
Android:text="Test"/>
API 19の結果:
API 21の結果:
私はあなたが経験していることを経験しました。簡単に言えば、<Button>
タグのみ、後方互換性を確保します。
最も単純で最も広く実践されている方法は、<RelativeLayout>
アンダーレイ、<Button>
。
ボタンコード:
<RelativeLayout
Android:id="@+id/myButtonUnderlay"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/colorPrimary"
Android:visibility="visible">
<Button
Android:id="@+id/myButton"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/selectableItemBackgroundBorderless"
Android:text="I am as cute as a Button"/>
</RelativeLayout>
ボタンを使用する必要がある場合はいつでも、この完全なコードを使用します。
内訳は次のとおりです:
myButton
にフックされます。myButtonUnderlay
の属性を変更して、ボタンの寸法を制御します。myButton
で、Android:background="?attr/selectableItemBackgroundBorderless"
。これにより、テキストだけの透明なボタンになり、後方互換性のある波紋になります。myButtonUnderlay
では、ボタン、マージン、パディング、ボーダー、グラデーション、シャドウなどの色の設定など、他のすべてのバックグラウンドアプリケーションを実行します。myButtonUnderlay
で行います。注:後方互換性を確保するには、必ず使用してください
Android:background="?attr/selectableItemBackgroundBorderless"
、および[〜#〜] not [〜#〜]
Android:background="?android:attr/selectableItemBackgroundBorderless"
それを解決する最善の解決策は、独自の_Ripple Effect
_を作成することだと思います。ボタンを押したときのパディングは、コンポーネントのデフォルトの_Ripple Effect
_を尊重しています。
_<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?attr/colorControlHighlight">
<item Android:drawable="?attr/colorPrimary"/>
</ripple>
_
または、ボタンのスタイルを_style="?android:textAppearanceSmall"
_に変更してみてください
要確認:この効果は、Android Lollipop (API 21)
以上でのみ表示されます。
パディングとマージンは、ボタンで使用される元のリソースの結果である場合があります。
そのため、セレクターを使用して、使用するリソースを変更することができます。
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true" Android:drawable="@drawable/btn_action_hover" />
<item Android:state_selected="true" Android:drawable="@drawable/btn_action_hover" />
<item Android:state_focused="true" Android:drawable="@drawable/btn_action_hover" />
<item Android:drawable="@drawable/btn_action_normal" />
</selector>
これにより、ボタンのデフォルトの画像/形状が変更されるため、ドロアブルを使用して、すべてのアイテムをドロアブルに設定してみてください。ドロアブルは、ビットマップ、または現在の状態のボタンの外観を定義する.xmlファイル(スタイルファイル)のいずれかです。あなたがボタンスタイルを自分で設定したとしても、まだいくつかのネイティブスタイルが含まれていると思います。これは、カスタムテーマを使用していないためである可能性があります。したがって、この問題は
theme="@style/myNewTheme"
ここで、myNewThemeはテーマであり、任意の親(parent=""
は定義しないでください)。
特定のテーマ(たとえば、Theme.AppCompat。[name]のようにGoogle/Androidによって設計されたもの)を使用すると、buttonStyleも付属します。これはTheme.Holo.Lightの一部です:
<!-- Button styles -->
<item name="buttonStyle">@style/Widget.Holo.Light.Button</item>
<item name="buttonStyleSmall">@style/Widget.Holo.Light.Button.Small</item>
<item name="buttonStyleInset">@style/Widget.Holo.Light.Button.Inset</item>
<item name="buttonStyleToggle">@style/Widget.Holo.Light.Button.Toggle</item>
<item name="switchStyle">@style/Widget.Holo.Light.CompoundButton.Switch</item>
<item name="mediaRouteButtonStyle">@style/Widget.Holo.Light.MediaRouteButton</item>
<item name="selectableItemBackground">@drawable/item_background_holo_light</item>
<item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
<item name="borderlessButtonStyle">@style/Widget.Holo.Light.Button.Borderless</item>
<item name="homeAsUpIndicator">@drawable/ic_ab_back_holo_light</item>
ご覧のとおり、このテーマは、基本機能でのボタンの外観/動作を定義します。一部をオーバーライドできますが、重要な部分はオーバーライドしていません(buttonStyleなど)。したがって、自分で新しいテーマを作成し、好みに合わせてスタイルを設定し、テーマを設定して(theme = "themename"を使用)、そのテーマがテーマを継承しない場合、心配することなくボタンを好みに合わせてスタイル設定できます。テーマのデフォルトスタイルについて
基本的に:
padding/margin = "0dp"を呼び出しても役に立ちません。テーマで定義されたデフォルトのドロウアブルには、ボタンドロウアブルにこれがあります。つまり、変更することはできません。そのため、ボタンのスタイルを変更するか、テーマを完全に変更する必要があります。多くのテーマがボタンのスタイルを定義するため、テーマに親がないことを確認してください。テーマで定義されたボタンスタイルは望ましくありません。
@David Medenjakの回答として、Google Material design Button-style を開発者向けサイトで読むことができます。 @David Medenjakが答えで説明したように、ボタンスタイルを使用します。また、次の方法で行うこともできます。パディングやマージンではありませんが、実際にはボタンの背景効果です。それを削除したい場合は、次のようにすることができます。
オプション1:
ステップ1:以下のコードをstyles.xmlに追加します
<style name="myColoredButton">
<item name="Android:textColor">#FF3E96</item>
<item name="Android:padding">0dp</item>
<item name="Android:minWidth">88dp</item>
<item name="Android:minHeight">36dp</item>
<item name="Android:elevation">1dp</item>
<item name="Android:translationZ">1dp</item>
<item name="Android:background">#FF0000</item>
</style>
ステップ2:drawablesフォルダーの下に新しいXMLファイルを作成し、次のコードを追加します。XMLファイルにbutton_prime.xmlという名前を付けました
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/colorPrimary">
<item>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<corners Android:radius="1dp" />
<solid Android:color="#8B8386" />
</shape>
</item>
</ripple>
手順3:次のように、ボタンでスタイルとドロウアブルを使用します。
<Button
style="@style/myColoredButton"
Android:layout_width="250dp"
Android:layout_height="50dp"
Android:text="Cancel"
Android:gravity="center"
Android:background="@drawable/button_prime"
Android:colorButtonNormal="#3578A9" />
オプション2:
Support Library v7では、すべてのスタイルが実際に既に定義されており、使用する準備ができているため、標準のボタンでは、これらのスタイルはすべて使用できます。
<Button
style="@style/Widget.AppCompat.Button.Borderless"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:text="BUTTON"
Android:gravity="center"
Android:minHeight="0dp"
Android:minWidth="0dp"
Android:background="@color/colorAccent"/>
ボタンスタイルの詳細については check this answerをご覧ください
この答え もチェックすると思います。あなたがあなたの解決策を手に入れることを願っています。
多くの解決策を試した後、ようやくタグだけではこれを達成できないという結論に達しました。ボタンの周りのこの不要なスペースを削除するには、私の解決策は次のとおりです:
<RelativeLayout
Android:id="@+id/myButtonUnderlay"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"
Android:visibility="visible">
<Button
Android:id="@+id/save_button"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:layout_marginTop="-5dp"
Android:layout_marginBottom="-5dp"
Android:layout_above="@+id/content_scrollview"
Android:layout_gravity="bottom"
Android:background="@drawable/ripple_theme"
Android:enabled="true"
Android:text="SetUp Store"
Android:textColor="#fff"
Android:textSize="18sp"
Android:visibility="gone"
tools:visibility="visible"
style="@style/MediumFontTextView" />
</RelativeLayout>
Button
背景をAndroid:background="?selectableItemBackground"
として設定します
<LinearLayout
Android:background="?attr/welcomeBottomNavBarBackground"
Android:orientation="horizontal"
Android:id="@+id/sign_in_bottom_nav_bar"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true">
<Button
style="?android:attr/buttonBarButtonStyle"
Android:background="?selectableItemBackground"
Android:id="@+id/sign_in_button"
Android:layout_width="0dp"
Android:width="0dp"
Android:layout_weight="1.0"
Android:layout_height="48dp"
Android:gravity="center"
Android:layout_gravity="center"
Android:enabled="true"
Android:textAllCaps="true"
Android:text="@string/log_in" />
</LinearLayout>
念のため this をご覧になることをお勧めします。
その後、動作しない場合は、Android xml drawables、およびpressed/notpressedを区別するためのドロアブル状態を使用して、独自のスタイルを作成することをお勧めします(azizbekianサジェストのような)).
自分のスタイルを使用すると、アプリの表示方法をより詳細に制御できるため、最良の答えになると思いますが、Androidデフォルトのテーマとスタイルを使用すると、ユーザーはカスタムスタイルを持つことができますただし、すべてのカスタムスタイルをテストすることはできないため、すべてのカスタムスタイルでアプリが正しく表示されることを確認できないため、一部のカスタムスタイルで問題が発生する可能性があります。