【问题标题】:How to remove extra padding from button views in Xamarin Forms for Android?如何从 Xamarin Forms for Android 中的按钮视图中删除额外的填充?
【发布时间】:2017-11-19 16:26:32
【问题描述】:

Xamarin Forms 上的按钮视图在部署到 Android 时似乎应用了额外的填充。我在我的 Android 项目下设置了 Resources/values/styles.xml,默认情况下所有间距、填充和边距都为 0,但仍然应用了额外的填充:

<item name="android:radius">0.0px</item>
<item name="android:shadowRadius">0.0</item>
<item name="android:spacing">0.0px</item>
<item name="android:padding">0.0px</item>
<item name="android:layout_margin">0.0px</item>

请看下面的比较,看看我在说什么(左边是 iOS,右边是 Android)。注意在 iOS 中视图是如何相互对齐的(它们应该是这样),而在 Android 中存在不必要的额外间隙。显示由绝对和堆栈布局、几个按钮和一个标签(长标签)的组合组成。不用担心 iOS 示例中的大小和排列不完美;这是故意的。 iOS 显示正是我希望它们看起来的样子。

理想情况下,我想要一种 Android 样式或简单的一刀切代码 sn-p,我可以使用它来摆脱 Android 固执己见的间距。边距、间距和填充在两个设备上以编程方式在视图上设置相同,因此这不应该是问题的根源。

请注意,我将 C# 与 Xamarin 表单一起使用,而不是 XAML。因此,请提供适用于两者的答案,或者至少可以通过 Xamarin Forms 的纯编程实现来工作。

这是另一个示例(左侧为 iOS,右侧为 Android)。最外面的布局是一个网格,包含六个非布局视图(两个按钮、两个标签和两个条目)以及底部的堆栈布局(同样包含一个按钮、一个标签和一个条目)。您可以从颜色的差异中看出,除了按钮之外,所有内容都正确排列。仅使用视图边距设置对齐方式;默认间距和填充全部归零(来自 Android 样式,见上文)。

【问题讨论】:

  • 带有“额外填充”的视图是按钮,对吗?
  • 请提供一些代码,以便我们重现此问题。
  • @apineda 这是一个很好的观点,我直到现在才注意到;它确实只适用于按钮。
  • @nbrosz 检查这个答案:stackoverflow.com/a/44578111/1771254
  • 这个“问题”发生在 Android 中而不是在您的 Xamarin.Forms 代码中,因此您需要从 Android 项目中修复它。为此,您必须为您的按钮创建一个 CustomRenderer 并将默认样式更改为您自己的样式。注意:这是 Android 中的默认行为。

标签: c# android xamarin xamarin.android xamarin.forms


【解决方案1】:

试试这个:

在你的 Android 项目中打开你的 Styles.xml

MyTheme.Base 样式内(我假设基于默认的 Xamarin.Forms 模板这样调用)添加以下行:

<item name="android:buttonStyle">@style/MyButton</item>

创建一个名为MyButton的新样式

<style name="MyButton" parent="android:Widget.Material.Button">
  <item name="android:layout_margin">0dip</item>
  <item name="android:background">@drawable/button_ripple</item>
 </style>   

在 Drawable 文件夹中添加一个名为 button_ripple.xml 的新 XML 文件并粘贴以下代码:

<?xml version="1.0" encoding="utf-8"?>
<!-- in drawable folder-->
<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">

    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="?android:colorAccent" />
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
            <solid android:color="#ff0000" />
        </shape>
    </item>
</ripple>

此文件是必需的,因为当 Android 中按钮的背景发生变化时,涟漪效果(点击它时的效果)会丢失。

如果您不关心效果,请返回样式文件,MyButton 样式可以是这样的:

<style name="MyButton" parent="android:Widget.Material.Button">
  <item name="android:layout_margin">0dip</item>
  <item name="android:background">#ff0000</item>
 </style>

如果没有 CustomRenderers,这可能会对您有所帮助。-

【讨论】:

  • 那会很好用,谢谢!不过,这对我来说就像魔术一样。我看不到这些矩形如何在 C# 中拾取按钮的颜色,或者它如何获得“涟漪”效果。但这也不是问题。这解决了我的问题。谢谢!
【解决方案2】:

Xamarin 按钮现在包含一个可设置为厚度的 Padding 属性。

Button button = new Button();
button.Text = "Button";
button.Clicked += OnClicked;
button.Padding = new Thickness(0, 0, 0, 0);

【讨论】:

    【解决方案3】:

    您可以使用link 中描述的 Device.Runtime 平台。

    基本上你可以根据操作系统选择边距的类型。

    if(Device.RuntimePlatform == Device.Android)
        button.margin = new Thickness(0);
    

    这就是你要找的吗?

    【讨论】:

    • 不,边距已经被归零或设置为我需要的值。填充和间距也被取消了。问题是 Android 按钮上有额外的间距,我无法解释并且不知道如何删除。
    • 您使用的是什么 Xamarin.Forms 版本?但无论如何,@apineda 的答案似乎就是你要找的。​​span>
    • 据我所知,他/她的回答没有提供任何删除间距的解决方案;他/她只是指出存在间距(我已经从 OP 中提供的屏幕截图中知道了这一点)。我正在使用 Xamarin 版本 4.5.0.476、Xamarin.Android 版本 7.3.1.2 和 Xamarin.iOS 版本 10.10.0.35
    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2013-10-14
    相关资源
    最近更新 更多