SetColorFilter在Xamarin.Android

时间:2017-07-11 07:10:13

标签: c# android xamarin 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);

以上代码不会更改箭头颜色。 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();
    }
  }

1 个答案:

答案 0 :(得分:3)

这是展示SetColorFilter在Android 7.1和Android 6.0模拟器上工作的最小示例。

<强> 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。其次,您应该使用AppCompatResourcesResourcesCompat GetDrawable方法而不是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