Android(Xamarin)selectableItemBackground - SetBackgroundResource不能与SetImageResource一起使用

时间:2017-08-03 07:30:56

标签: android xamarin imagebutton

我正在使用自定义网格适配器创建图像按钮并在活动上显示它们,使用SetImageResource()方法设置按钮的src图像。

但是,单击时,这些按钮没有所需的按钮单击/波纹效果。环顾四周后,我找到了几个解决方案,使用TypedValue SetBackgroundResource(),或TypedArray SetBackgroundDrawable()。如果没有图像资源,这些方法中的任何一种都可以工作,但在添加图像资源时,selectableItemBackground效果会消失。

代码如下:

ImageButton button;

if (convertView == null)
{
    LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);

    //  Grid buttons
    convertView = inflater.Inflate(Resource.Layout.sublayout_Menu_Button, null);

    button = convertView.FindViewById<ImageButton>(Resource.Id.mainMenu_ImgBtn);

    button.SetMinimumHeight(Main_Menu.GRID_HEIGHT / numRows);

    TypedValue tv = new TypedValue();
    context.Theme.ResolveAttribute(Resource.Attribute.selectableItemBackground, tv, true);
    button.SetBackgroundResource(tv.ResourceId);

    //  This code is another method that works similarly to the above                
    //int[] attrs = new int[] { Android.Resource.Attribute.SelectableItemBackground };
    //TypedArray ta = context.ObtainStyledAttributes(attrs);
    //Drawable drawableFromTheme = ta.GetDrawable(0);
    //ta.Recycle();
    //button.SetBackgroundDrawable(drawableFromTheme);

    button.SetImageResource(buttonImages[position]);

    switch (position)
    {
        case 0:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Select_Hospital));
                context.StartActivity(intent);
            };
            break;

        case 1:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(My_Appointments));
                context.StartActivity(intent);
            };
            break;

        case 2:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Treatment_Information));
                context.StartActivity(intent);
            };
            break;

        case 3:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Search));
                context.StartActivity(intent);
            };
            break;
    }
}

如何解决此问题?非常感谢任何帮助!

- 编辑 -

MyImageButton代码:

class MyImageButton : ImageButton, IOnTouchListener
{
    private Context context;

    public MyImageButton(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        this.context = context;
        this.SetOnTouchListener(this);
    }

    public bool OnTouch(View v, MotionEvent e)
    {
        if (e.Action == MotionEventActions.Down)
        {
            ImageView iv = (ImageView)v;
            iv.SetColorFilter(new Android.Graphics.Color(context.GetColor(Resource.Color._5_grey)));
        }
        else if (e.Action == MotionEventActions.Up)
        {
            ImageView iv = (ImageView)v;
            iv.ClearColorFilter();
        }
        return true;
    }
};

AXML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Dental_IT.Droid.Adapters.MyImageButton
        android:id="@+id/mainMenu_ImgBtn"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:background="@null" />
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

  

单击时,这些按钮没有所需的按钮单击/连锁效果。

单击ImageButton时,它确实有一个按钮点击/涟漪效果,但图像覆盖了它。

您可以自定义ImageButton来处理触摸事件,在收到点击事件时,您可以在图片上添加ColorFilter以实现点击/连锁效果。

这是我的代码:

public class MyImageButton : ImageButton
{
    public float[] BT_SELECTED_DARK = new float[] { 1, 0, 0, 0, -50, 0, 1,
            0, 0, -50, 0, 0, 1, 0, -50, 0, 0, 0, 1, 0 };

    public MyImageButton(Context context, IAttributeSet attrs):base(context,attrs)
    {
    }

    public override bool OnTouchEvent(MotionEvent e)
    {
        if (e.Action == MotionEventActions.Down)
        {
            this.SetColorFilter(new ColorMatrixColorFilter(BT_SELECTED_DARK));
        }
        else if (e.Action == MotionEventActions.Up)
        {
            this.ClearColorFilter();
        }
        return base.OnTouchEvent(e);
    }
}

添加图片资源时:

button.SetImageResource(Resource.Drawable.download);
button.Click += (sender, e) =>
{
    Toast.MakeText(this,"Hi, I am York!",ToastLength.Short).Show();
};

效果:

enter image description here