在Xamarin.Android中,SetColorFilter无法工作

5
var upArrow = Resources.GetDrawable(Resource.Drawable.abc_ic_ab_back_material);
upArrow.SetColorFilter(Resources.GetColor(Android.Resource.Color.White), PorterDuff.Mode.SrcIn);
SupportActionBar.SetHomeAsUpIndicator(upArrow);

以上代码未更改箭头颜色。upArrow ColorFilter值为null。这是什么原因?我不是在问如何更改可绘制对象的颜色。我的问题是为什么上述代码不能设置颜色过滤器?以下是MainActivity代码。

public class MvxFormsApplicationActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        base.OnCreate(bundle);

        Xamarin.Forms.Forms.Init(this, bundle); ;
        //Plugins.NewictLib.Forms.Android.Renderers.GifImageViewRenderer.Init ();
        DLToolkit.Forms.Controls.FlowListView.Init ();
        UserDialogs.Init ((Activity) Xamarin.Forms.Forms.Context);

        OxyPlot.Xamarin.Forms.Platform.Android.PlotViewRenderer.Init();

        //            var mvxFormsApp = new MvxFormsApp ();
        //            LoadApplication (mvxFormsApp);
        var myApp = new MyFormsApp();
        LoadApplication (myApp );
        AppCompatDelegate.CompatVectorFromResourcesEnabled = true;
        //the following needs to set so that the back button color can be changed
        var upArrow = Resources.GetDrawable(Resource.Drawable.abc_ic_ab_back_material);
        upArrow.SetColorFilter(Resources.GetColor(Android.Resource.Color.White), PorterDuff.Mode.SrcIn);
        SupportActionBar.SetHomeAsUpIndicator(upArrow);

               if (IsPlayServicesAvailable())
        {
            var intent = new Intent(this, typeof(RegistrationIntentService));
            StartService(intent);
        }
        //var presenter = Mvx.Resolve<IMvxViewPresenter>() as MvxFormsDroidMasterDetailPagePresenter;
        var presenter = Mvx.Resolve <IMvxViewPresenter> () as MVxFormsDroidCustomPagePresenter;//MvxFormsDroidPagePresenter;
        if ( presenter == null ) {
            throw new ArgumentNullException (nameof(presenter), "MvxFormsApplicationActivity: Please check your Activity class and ensure the presenter has value");
        }
        //presenter.MvxFormsApp = mvxFormsApp;
        presenter.MvxFormsApp = oznesFormsApp;
        Mvx.Resolve<IMvxAppStart>().Start();
    }
  }

可能是如何在Android中更改Drawable的颜色?的重复问题。 - Cheesebaron
@Cheesebaron 不!关键不是如何解决问题,而在于为什么它不能工作。 - Heshan
"upArrow ColorFilter值为null。" 我使用了您的代码进行测试,但在我的端上它不是null。请问您的Android目标版本是多少? - Grace Feng
这是安卓7.1。在你的要求下我将其更改为安卓6.0,但结果相同。 - Heshan
1个回答

3
这是一个最简演示,展示了在Android 7.1和Android 6.0模拟器上使用SetColorFilter的工作原理。

MainActivity.cs

[Activity(Label = "App39", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        var upArrow = AppCompatResources.GetDrawable(this, Resource.Drawable.abc_ic_ab_back_material);
        upArrow.SetColorFilter(new Color(ContextCompat.GetColor(this, Android.Resource.Color.HoloBlueBright)), PorterDuff.Mode.SrcIn);
        SupportActionBar.SetDisplayHomeAsUpEnabled(true);
        SupportActionBar.SetHomeAsUpIndicator(upArrow);

        Button b = FindViewById<Button>(Resource.Id.button);
        b.Click += B_Click;
    }

    private void B_Click(object sender, System.EventArgs e)
    {
        Intent i = new Intent(this, typeof(MainActivity));
        StartActivity(i);
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="App39.App39" android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="16" />
  <application android:label="App39" android:theme="@style/Theme.AppCompat.Light"></application>
</manifest>

我的代码和你的代码有什么区别?

你使用了两个已弃用的方法,实际上,你应该使用支持库的等效方法。例如 ContextCompat.GetColor。其次,你应该使用 AppCompatResourcesResourcesCompatGetDrawable 方法,而不是 Resources.GetDrawable

https://developer.android.com/reference/android/support/v7/content/res/AppCompatResources.html#getDrawable(android.content.Context, int)

https://developer.android.com/reference/android/support/v4/content/res/ResourcesCompat.html#getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme)

Android API 25


请确保您正在编译>= API 21:https://developer.android.com/reference/android/content/Context.html#getDrawable(int) - Jon Douglas
我已经更新了问题并添加了更多的代码,请查看。 - Heshan
最低Android版本为4.0.3(API级别15),目标android版本 - 使用SDK版本编译,编译使用的Android版本为(Android 7.1 Nougat)。 - Heshan
我正在使用两个真实设备(API 19和API 22)。在这两个设备上,我看到的结果是相同的。 - Heshan
1
问题在于您正在使用Forms,它添加了一个额外的抽象层,这可能会将值设置为默认值。如果您最初将此问题标记为Forms,我相信其他人会有比我更好的答案。我的解决方案在大多数情况下适用于原生Xamarin.Android。 - Jon Douglas
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接