2016-08-20 2 views
1

Я сделал очень простой проект, используя последнюю версию MvvmCross (4.2.3), в которой у меня есть 2 экрана Android: FirstView и SecondView. Я использую кнопку на FirstView, чтобы перейти к SecondView:Простая 2-х экранная навигация в Android-приложении MvvmCross отключается

// FirstView.cs 
private void PrepareShowSecondButton() 
{ 
    var hero = FindViewById<Button>(Resource.Id.firstview_show_second_button); 
    hero.Text = DreamsResources.FirstView_ShowSecond_Button_Label; 
    BindingSet.Bind(hero).To(vm => vm.ShowSecondCommand); 
    BindingSet.Apply(); 
} 


// FirstViewModel.cs 
private MvxCommand _showSecondCommand; 

public MvxCommand ShowSecondCommand 
{ 
    get 
    { 
     _showSecondCommand = _showSecondCommand ?? new MvxCommand(DoShowSecondCommand); 
     return _showSecondCommand; 
    } 
} 

private void DoShowSecondCommand() 
{ 
    ShowViewModel<SecondViewModel>(new SecondViewModelBundle() { Data = "Hello from FirstView - " + Hello }); 
} 

Однако, когда я использую BackButton на андроид устройства, и нажмите на кнопку, чтобы показать SecondView снова, SecondView добавляется несколько раз (5-6) в стек навигации. Мне нужно нажать кнопку «Назад» столько раз, чтобы вернуться в FirstView.

Код:

public class SecondViewModel : DreamsViewModelBase 
{ 
    private readonly IDreamsWebService _webService; 

    public SecondViewModel(IDreamsWebService webService) 
    { 
     _webService = webService; 
    } 

    public void Init(SecondViewModelBundle bundle) 
    { 
     Log.Log("Initializing with data: " + bundle.Data); 
     SecondData = bundle.Data; 
    } 

    private string _secondData; 

    public string SecondData 
    { 
     get { return _secondData; } 
     set { SetProperty(ref _secondData, value, "SecondData"); } 
    } 
} 

Планировка:

<android.support.design.widget.CoordinatorLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:local="http://schemas.android.com/apk/res-auto" 
android:id="@+id/activity_firstview_top_container_coordinatorlayout" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    local:layout_scrollFlags="scroll|enterAlways" 
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 
<LinearLayout 
    android:id="@+id/firstview_content_container_linearlayout" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?attr/actionBarSize"> 
    <EditText 
     android:id="@+id/firstview_edittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="40dp" /> 
    <TextView 
     android:id="@+id/firstview_textview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="40dp" /> 
    <Button 
     android:id="@+id/firstview_show_second_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
</android.support.design.widget.CoordinatorLayout> 

Как я избежать SecondView быть добавлены в несколько раз навигации стека? Я даже попытался установить флаг активности «SingleTop», который кажется плохим решением, и даже не работал.

+1

Код не выглядит неправильным для меня. Единственное, о чем я могу думать, это то, что вы вызываете 'PrepareShowSecondButton' несколько раз, дублируя привязку. Это откроет второе представление столько раз, сколько количество привязок, примененных к кнопке «hero» – xleon

+1

Можете ли вы показать полные «FirstView» и «FirstViewModel»? –

ответ

1

В вашем проекте в GitHub вы вызываете метод PrepareUI в обратном вызове жизненного цикла onResume. Это добавляет (стеки) те же привязки при каждом возобновлении FirstView (при первом открытии приложения каждый раз, когда SecondView закрывается). Таким образом, вы получаете несколько привязок на кнопке Show SecondViewModel, что приводит к тому, что несколько раз открывается модель просмотра.

Существует не предусмотрены методы, который очистит привязки, но вы можете делать другие вещи:

  1. создать новый объект BindingSet
  2. называют ваш PrepareUI в методе onCreate

 Смежные вопросы

  • Нет связанных вопросов^_^