Android 按钮样式在不同设备(AOSP 和 Samsung Galaxy)上看起来不同

Android button styling looks different on different devices (AOSP and Samsung Galaxy)

我正在开发一个应用程序,我正在 OnePlus 3 和 Samsung Galaxy Tab A 上进行测试。这款平板电脑是我最近添加的列表,到目前为止所有的开发都是在 OnePlus 3 上进行的。

我的问题是同一个按钮在 Galaxy 平板电脑上的显示方式与在 OnePlus 3 上的显示方式不同。

之前,我曾在 Android Studio 中的 Nexus 9 模拟器上试用过该应用程序,它得到了应有的重现。这让我觉得三星搞砸了一些东西,改变了我按钮的外观。

更准确地说,按钮背景填满了平板电脑上的整个视图,如屏幕截图所示。我想让它像一个普通的 android 按钮。

我的按钮代码是这样的

<Button
    android:id="@+id/outputButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-4dp"
    android:text=""
    android:textSize="13sp"/>

如果我在按钮上指定背景 (btn_default),我可以获得相同的外观。但这显然会导致按钮的动画不再起作用。 根据我的理解,默认样式(Widget.AppCompat.Button;我也尝试明确说明)也应该使用默认背景(btn_default),但我对此的理解似乎存在一些缺陷。

那么如何在两个设备上获得相同的外观?

银河标签 A -

一加 3 -

  <android.support.v7.widget.AppCompatButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="-4dp"
        android:text=""
        android:textSize="13sp" />

大多数情况下它会起作用,因为 AppCompatButton 这个 Button 的子类并且可以压缩所有设备。

好吧,我明白了。不是最干净的解决方案,但它有效。

将其用于按钮的可绘制背景。我提到的值直接取自 material 设计源文件。您可以修改它们以更改按钮的外观。 最重要的是,我必须添加 ripple 标签以允许标准动画。

<?xml version="1.0" encoding="utf-8"?>

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetBottom="6dp"
       android:insetLeft="4dp"
       android:insetRight="4dp"
       android:insetTop="6dp">
    <ripple
        android:color="?attr/colorControlHighlight">
        <item>
            <shape android:shape="rectangle">
                <corners android:radius="2dp"/>
                <solid android:color="?attr/colorButtonNormal"/>
                <padding
                    android:bottom="4dp"
                    android:left="8dp"
                    android:right="8dp"
                    android:top="4dp"/>
            </shape>
        </item>
    </ripple>
</inset>

一开始我还是不明白为什么会出现这个问题,但这解决了问题。