Xamarin Android ProgressBar - PullRequest
       7

Xamarin Android ProgressBar

0 голосов
/ 11 сентября 2018

Я изо всех сил пытаюсь использовать ProgressBar в структуре MVVMCross Android Xamarin. Первоначально я хотел связать видимость ProgressBar с полем в моей ViewModel. Это оказалось трудным, я попробовал несколько перестановок и попробовал предложения отсюда: Как установить видимость для ProgressBar в Android MvvmCross Xamarin

У меня есть другие элементы, такие как кнопки, которые я смог успешно привязать в другом месте моего проекта, поэтому я не уверен, почему это было такой большой проблемой. После многих попыток я решил попробовать установить Visibility прагматично в ViewModel. Я перепробовал несколько методов, но то, что я наконец-то подумал, наверняка сработает.

Xaml:

<ProgressBar
    android:id="@+id/progressBarMap"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone"
    style="@android:style/Widget.ProgressBar.Large" />

Я пробовал с видимостью по умолчанию и без нее. Я попробовал локальный: MvxBind с несколькими обычными методами привязки, а затем с помощью пользовательского конвертера или с плагином Visibility.

В своем фрагменте я с сожалением установил свойство FragmentActivity в моей модели представления, просто чтобы посмотреть, смогу ли я заставить это работать в некоторой форме (OnCreateView):

ViewModel.FragActivity = this.Activity;
ViewModel.Progress = view.FindViewById<Android.Widget.ProgressBar>(Resource.Id.progressBarMap);

Обратите внимание, что я также попытался установить ProgressBar в поле с именем Progress и использовать его в моей ViewModel.

Вот где я манипулирую ProgressBar в моей ViewModel:

private void AddOfflinePoints()
{
    try
    {
        FragActivity.RunOnUiThread(() => 
        {
            //I've also tried using the above Progress property. That wasn't null but did not update.
            ProgressBar barOfProgression = FragActivity.FindViewById<ProgressBar>(Resource.Id.progressBarMap);
            //barOfProgression is null :(
            barOfProgression.Visibility = ViewStates.Visible;
            barOfProgression.Enabled = true;
        });

        //Code to run while spinning the progress bar (It is inside Task.Run)
    }
    catch (Exception)
    {
        //Exception Handling code...
    }

    FragActivity.RunOnUiThread(() => Progress.Visibility = ViewStates.Gone);
}

Что я делаю не так? Я перепробовал множество перестановок, что угодно в Google и ознакомился с ограниченной документацией Xamarin. Любая помощь или указатели очень ценятся.

Спасибо.

1 Ответ

0 голосов
/ 12 сентября 2018

Оказывается, проблема в том, что компоновщик удалил свойство Visibility.Я получил идею из этого поста: Ошибка привязки видимости

Я добавил следующий код в LinkerPleaseInclude:

public static void Include(ProgressBar progressBar)
{
    progressBar.Click += (s, e) => progressBar.Visibility = progressBar.Visibility - 1;
}

Если кому-то интересно, как я это сделал, нижеэто код:

Xaml:

<ProgressBar
    android:id="@+id/progressBarMap"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    local:MvxBind="Visibility Visibility(ShowProgress)"
    style="@android:style/Widget.ProgressBar.Large" />

ViewModel:

private bool _showProgress;
public bool ShowProgress
{
    get => _showProgress;
    set => SetProperty(ref _showProgress, value);
}

Где SetProperty из класса MvxNotifyPropertyChanged.

...