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

时间:2016-11-28 07:04:40

标签: android android-layout android-button

我正在开发一款我正在OnePlus 3和三星Galaxy Tab A上测试的应用程序。这款平板电脑是我最近的一个新增功能,直到现在所有的开发都在OnePlus 3上。

我的问题是Galaxy Tablet上的按钮与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),但我对此的理解似乎存在一些缺陷。

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

Galaxy Tab A -

enter image description here enter image description here

OnePlus 3 -

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

  <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的{​​{1}}子类可以与所有设备兼容。

答案 1 :(得分:0)

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

将此选项用于按钮的背景可绘制。我提到的值直接取自材料设计源文件。你可以修改它们来改变按钮的外观。 最重要的是,我必须添加纹波标记以允许标准动画。

<?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>

我仍然不明白为什么问题首先发生,但这解决了这个问题。