Принятое решение не работало для меня на pre-Lollipop, но я нашел, что это решение подходит для всех API, и, кроме того, оно не использует устаревший код:
// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}
Удачного кодирования!
Вам нужно либо просто использовать объект
в объявлении словаря (все это личное, и вы можете убедиться, что вы никогда не ошибетесь) что-то в этом роде) или объявить неуниверсальный интерфейс ICanCreate
, который расширяется ICanCreate
.
В основном вам нужно отношение типов, которое не может быть выражено на C # - и всякий раз, когда это происходит, вы получаете немного неприятное решение, но похоже, что вы можете изолировать уродство здесь (т.е. оставить его в пределах одного класса).
Интересно, что эта проблема решена в C # 4.0:
public interface ICanCreate<out T> // covariant
{
T NewObject();
}
public class Factory
{
private Dictionary<Type, ICanCreate<object>> mappings = new Dictionary<Type, ICanCreate<object>>();
public void RegisterCreator<T>(ICanCreate<T> creator) where T:class
{
mappings[typeof(T)] = creator;
}
public T Create<T>()
{
ICanCreate<object> creator = mappings[typeof(T)];
return (T) creator.NewObject(); // I do not think you can get rid of this cast
}
}