#android #xamarin #mvvmcross
#Android #xamarin #mvvmcross
Вопрос:
Я использую MvvmCross уже пару месяцев и до сих пор был очень впечатлен. Однако я столкнулся с проблемой, которую пока не смог решить.
Я разбил это на самое простое решение, которое я могу, чтобы проблему можно было воспроизвести. Проблема связана с наличием кнопки для действия, которая оформлена в «диалоговой» теме. При повороте устройства привязки команд кнопок теряются, и кнопки больше не запускают команды в модели представления. Странно то, что все остальные привязки все еще работают.
Для имитации этого я создал решение, которое имеет
1) Простая MvxActivity с одной кнопкой. Эта кнопка открывает второе действие, которое оформлено как диалоговое окно.
2) На этом втором MvxActivity у меня есть пара кнопок и элемент управления EditText и TextView. Кнопки привязаны к командам в модели представления, а EditText и TextView также привязаны к свойствам.
Я попытался добавить следующий атрибут ко второму действию (как предложено в другом месте), но это не работает.
ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize
Вот второе представление, которое вызывает проблему. Удаление атрибута theme заставит его работать, но я хочу тему диалога!:
using Android.App;
using Android.OS;
using Cirrious.MvvmCross.Droid.Views;
namespace RotateIssue.Views
{
[Activity(Label = "MyActivity", Theme = "@android:style/Theme.Holo.Dialog")]
public class SecondView : MvxActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.SecondView);
}
}
}
Вот viewmodel для этого представления:
using Cirrious.MvvmCross.ViewModels;
using System.Windows.Input;
namespace RotateIssue.Core.ViewModels
{
public class SecondViewModel : MvxViewModel
{
private string _hello = "";
public string Hello
{
get { return _hello; }
set { _hello = value; RaisePropertyChanged(() => Hello); }
}
public bool DataValid
{
get
{
return (_hello.Length > 0);
}
}
private MvxCommand _saveCommand;
public ICommand SaveCommand
{
get
{
_saveCommand = _saveCommand ?? new MvxCommand(SaveAsset);
return _saveCommand;
}
}
private MvxCommand _cancelCommand;
public ICommand CancelCommand
{
get
{
_cancelCommand = _cancelCommand ?? new MvxCommand(Cancel);
return _cancelCommand;
}
}
public void Cancel()
{
Close(this);
}
public void SaveAsset()
{
if (DataValid)
{
//TODO: Do something useful
Close(this);
}
}
}
}
При необходимости я могу предоставить AXML. Приложение настроено на уровне API 16.
Комментарии:
1. Может быть, попробуйте добавить
ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize
к родительскому действию, а не к диалоговому окну?2. Хорошо — кажется, это сработало! Мне нужно будет проверить мой основной проект, чтобы узнать, вызывает ли это изменение какие-либо другие проблемы, но я не вижу в этом проблемы. Большое спасибо за быстрый ответ.