Что делает компилятор, это тянуть вашу лямбду и любые переменные, захваченные лямбдой, в генерируемый компилятором вложенный класс.
После компиляции ваш пример выглядит примерно так:
class Program
{
delegate void Action();
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
DisplayClass1 displayClass1 = new DisplayClass1();
for (displayClass1.i = 0; displayClass1.i < 10; ++displayClass1.i )
actions.Add(new Action(displayClass1.Lambda));
foreach (Action a in actions)
a();
}
class DisplayClass1
{
int i;
void Lambda()
{
Console.WriteLine(i);
}
}
}
Сделав копию в цикле for, компилятор генерирует новые объекты на каждой итерации, например:
for (int i = 0; i < 10; ++i)
{
DisplayClass1 displayClass1 = new DisplayClass1();
displayClass1.i = i;
actions.Add(new Action(displayClass1.Lambda));
}
Принятое решение не работало для меня на 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);
}
Удачного кодирования!
/**change your progress drawable asrequired****/
Drawable wrapDrawable = DrawableCompat.wrap(_progress.getIndeterminateDrawable());
DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(this, R.color.colorOrange));
_progress.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
Попробуйте изменить ProgressBar
на это
<ProgressBar
android:id="@+id/view_progress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="50dp"
android:layout_height="50dp"
android:indeterminate="true"
android:indeterminateTintMode="src_in"
android:indeterminateTint="@color/red"
/>
Также вы можете сделать это программно, выполнив следующие действия:
ProgressBar progressBar;
progressBar = (ProgressBar)findViewById(R.id.view_progress);
progressBar.getProgressDrawable().setColorFilter(Color.RED, Mode.SRC_IN);
Чтобы избежать окрашивания фона ProgressBar
, вы должны получить ссылку на точный точечный рисунок из внутреннего ProgressBar
LayerDrawable
. Это хакерский способ сделать это, но он работает.
LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable drawable = layerDrawable.getDrawable(2); // The progress bitmap
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);