为什么我不能在以编程方式添加的视图上设置高度?

Why can't I set the elevation on a view that I add programmatically?

免责声明:我正在使用 Xamarin.Android。

我创建了一个视图,设置了它的高度,然后将它添加到我的主布局中。当我触发事件时,视图成功添加到布局中,但没有任何高程阴影。

这是我正在使用的东西:

以编程方式添加的视图:

public class TooltipTest : FrameLayout
{
    private Context context;
    private ShapeDrawable box;
    private View carrot;
    private string message;

    public TextView TooltipText
    {
        get;
        private set;
    }

    public TooltipTest(Context context, string message) : base(context)
    {
        this.context = context;
        this.message = message;

        Initialize();
    }

    private void Initialize()
    {
        CreateText();
    }

    private void CreateText()
    {
        int paddingTopBottom = 30;
        int paddingLeftRight = 27;

        TooltipText = new TextView(context);
        TooltipText.Text = message;
        TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
        TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
        TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
        TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

        AddView(TooltipText);
    }

添加视图的事件:

        ButtonTest.Click += (sender, e) => {
            var tooltip = new TooltipTest(this, Resources.GetString(Resource.String.test_text));
            var tooltipParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);
            tooltip.Elevation = 20f;
            ParentLayout.AddView(tooltip, tooltipParams);
        };

关于为什么不显示阴影的任何想法?我试过在 tooltip 上设置 SetClipToPadding(false)SetClipChildren(false),但这没有效果。

使用 AppCompat 方法 ViewCompat.SetElevation(View, int) 根据需要设置高度。但在 Lollipop 之前的设备上,该方法似乎什么都不做。 我发现将阴影渲染到 pre-Lollipop UI 元素的唯一方法是使用背景代替:

  android:background="@android:drawable/dialog_holo_light_frame"

如果您想深入了解此主题,请转至此 reddit 主题并搜索 elevation。那里有非常好的更新信息。

我发现为什么在我的自定义 TooltipTest 视图中设置海拔高度不起作用。问题在于该视图本身没有任何背景设置,根据 Android 的文档,背景中需要某种资源 属性,无论是颜色还是一些可绘制的。

正如您从我的原始 post 中看到的那样,在我的 TooltipTest class 中,它继承自 FrameLayout,我创建了一个 TextView(TooltipText) 并将其添加到布局中。然后,在我的 Activity class 中,我设置了 TooltipTest class 的高度。由于我没有为 TooltipTest 布局 class 显式设置背景资源,Android 不知道要为什么绘制阴影。

要解决我的问题,我只需将 Elevation 添加到 TooltipText 对象,而不是 TooltipTest 对象。

private void CreateText()
{
    int paddingTopBottom = 30;
    int paddingLeftRight = 27;

    TooltipText = new TextView(context);
    TooltipText.Text = message;
    TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
    TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
    TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
    TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

    TooltipText.Elevation = 21f; //(or whatever value you want)

    AddView(TooltipText);
}

如果你想在 TooltipTest 上添加阴影 class,你需要设置背景 属性:

private void CreateText()
{
    int paddingTopBottom = 30;
    int paddingLeftRight = 27;

    TooltipText = new TextView(context);
    TooltipText.Text = message;
    TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
    TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
    TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
    TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

    SetBackgroundColor (new Color (ContextCompat.GetColor (context, Resource.Color.white)));

    AddView(TooltipText);
}

以后一种方式进行操作会给您带来丑陋的白色背景,并在其下方有阴影。但是,您可以为背景使用任何类型的可绘制对象 属性。除了使用 SetBackgroundColor(Color color),您还可以使用 Background = (some drawable);