Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SetColorFilter is not working in Xamarin.Android

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

The above code does not change the arrow color. upArrow ColorFilter value is null. What should be the reason for this? I'm not asking how to change the drawable color. My question is why the above code fails to set the color filter? Following is the MainActivity code.

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();
    }
  }
like image 922
Heshan Avatar asked Oct 17 '22 09:10

Heshan


1 Answers

Here's a minimal sample demonstrating SetColorFilter working on a Android 7.1 and Android 6.0 emulator.

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>

What's the difference between my code and your code?

You're using two deprecated methods which in reality, you should be using the Support library equivalent. Such as ContextCompat.GetColor. Secondly you should be using the AppCompatResources or ResourcesCompat GetDrawable method instead of 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

like image 75
Jon Douglas Avatar answered Oct 21 '22 08:10

Jon Douglas