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

时间:2016-06-09 01:36:52

标签: android xamarin.android android-elevation

免责声明:我使用的是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),但这没有效果。

2 个答案:

答案 0 :(得分:3)

使用AppCompat方法ViewCompat.SetElevation(View, int)根据需要设置高程。但是在Lollipop之前的设备上,该方法似乎无能为力。 我发现为前Lollipop UI元素渲染阴影的唯一方法是使用背景:

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

如果您想更多地了解此主题,请转到此reddit主题并搜索高程。那里有非常好的更新信息。

答案 1 :(得分:1)

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

从我的原始帖子中可以看到,在TooltipTest类中继承了FrameLayout,我创建了一个TextView(TooltipText)并将其添加到布局中。然后,在我的Activity课程中,我在TooltipTest课程上设置了提升。由于我没有为TooltipTest布局类显式设置背景资源,因此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类上使用阴影,则需要设置Background属性:

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);
}

以后一种方式做它会给你一个丑陋的白色背景,下面有一个阴影。但是,您可以为Background属性使用任何类型的drawable。您可以执行SetBackgroundColor(Color color)

,而不是使用Background = (some drawable);