Ich entwickle gerade eine mobile Anwendung mit Xamarin.Android und MvvmCross, wieder. Ich habe verschiedene Ansichten, die richtig funktionieren (MvxActivity). Aber ich habe ein Problem mit der letzten Ansicht:MvvmCross: Android App stürzt ohne Informationen ab
Wenn ich mit ShowViewModel <MvxViewModel>
zu ihm navigieren, stürzt die Anwendung ohne Informationen ab (yeap, Stacktrace noch leer). In dieser Ansicht habe ich versucht, mit CoordinatorLayout Materialregisterkarten zu erstellen. Dazu habe ich ein Viewmodel (die ordnungsgemäß in Windows funktioniert):
public class HomeViewModel : MvxViewModel
{
protected readonly IService _service;
protected const string ValidateEditionMessage = "Voulez-vous modifier?";
protected const string Edit = "Modifier";
protected const string Confirmation = "Confirmation";
protected const string Cancel = "Annuler";
public IMvxCommand SaveChangedCommand
{
get
{
return new MvxCommand<Item>(async (m) =>
{
var result = await Mvx.Resolve<IDialogService>().ShowAsync(ValidateEditionMessage, Confirmation, Edit, Cancel);
if (result.Value) await _service.UpdateAsync(_item.Id, _item);
});
}
}
protected Item _item;
public Item Item
{
get { return _item; }
set { this.RaiseAndSetIfChanged(ref _item, value,() => Item); }
}
private FirstViewModel _FirstViewModel;
public FirstViewModel FirstViewModel
{
get { return _FirstViewModel; }
set { this.RaiseAndSetIfChanged(ref _FirstViewModel, value,() => FirstViewModel); }
}
private SecondViewModel _SecondViewModel;
public SecondViewModel SecondViewModel
{
get { return _SecondViewModel; }
set { this.RaiseAndSetIfChanged(ref _SecondViewModel, value,() => SecondViewModel); }
}
private ThirdViewModel _ThirdViewModel;
public ThirdViewModel ThirdViewModel
{
get { return _ThirdViewModel; }
set { this.RaiseAndSetIfChanged(ref _ThirdViewModel, value,() => ThirdViewModel); }
}
public HomeViewModel(IService service)
{
_service = service;
FirstViewModel = new FirstViewModel();
SecondViewModel = new SecondViewModel();
ThirdViewModel = new ThirdViewModel();
}
public async void Init(int id)
{
Item = await _service.GetItemAsync(id);
FirstViewModel.Item = SecondViewModel.Item = ThirdViewModel.Item = Item;
}
}
Eine Android-Ansicht für dieses Ansichtsmodell:
[Activity(Theme = "@style/Theme.AppCompat")]
public class HomeView : MvxCachingFragmentCompatActivity<HomeViewModel>
{
protected override void OnCreate(Bundle bundle)
{
Mvx.Trace("HomeView OnCreate(bundle)");
base.OnCreate(bundle);
SetContentView(Resource.Layout.Home);
var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
if (viewPager != null)
{
Mvx.Trace("viewPager found in " + nameof(HomeView));
var fragments = new List<MvxCachingFragmentStatePagerAdapter.FragmentInfo>
{
new MvxCachingFragmentStatePagerAdapter.FragmentInfo("First", typeof(FirstFragment), ViewModel.FirstViewModel),
new MvxCachingFragmentStatePagerAdapter.FragmentInfo("Second", typeof(SecondFragment), ViewModel.SecondViewModel),
new MvxCachingFragmentStatePagerAdapter.FragmentInfo("Third", typeof(ThirdFragment), ViewModel.ThirdViewModel)
};
Mvx.Trace("{0} fragments", fragments.Count);
viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(this, SupportFragmentManager, fragments);
}
var tabLayout = FindViewById<TabLayout>(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
}
}
Ein AXML Layout für diese Ansicht (Resource.Layout.Home):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
app:tabGravity="center"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
Natürlich, ich habe meine drei Fragmente: FirstFragment, SecondFragment, ThirdFragment, die wie folgt aussehen:
public class FirstFragment : MvxFragment
{
public FirstFragment()
{
Mvx.Trace(nameof(FirstFragment) + " constructor");
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return this.BindingInflate(Resource.Layout.First, null);
}
}
The corresponding ViewModels are basic, run on Windows, and are available on my GitHub, here
Die letzten Zeilen meines Stacktrace:
mvx : Diagnostic : 17.66 Showing ViewModel HomeViewModel
[art] JNI RegisterNativeMethods: attempt to register 0 native methods for md5204979768ea66d3a79201c4efd7c602a.MvxAppCompatActivity_1
mvx : Diagnostic : 17.69 HomeView constructor
[Mono] Assembly Ref addref MyApp.Droid[0xac176060] -> Xamarin.Android.Support.Design[0xac177b00]: 2
[Mono] Assembly Ref addref Xamarin.Android.Support.Design[0xac177b00] -> Xamarin.Android.Support.v4[0xac178640]: 5
mvx : Diagnostic : 17.70 HomeView OnCreate(bundle)
[Mono] Assembly Ref addref MvvmCross.Droid.Support.V7.AppCompat[0xac1787c0] -> Xamarin.Android.Support.v4[0xac178640]: 6
mvx : Diagnostic : 17.71 Attempting to load new ViewModel from Intent with Extras
[Mono] Assembly Ref addref MvvmCross.Droid.Support.V7.AppCompat[0xac1787c0] -> Xamarin.Android.Support.v4[0xac178640]: 6
mvx : Diagnostic : 17.71 Attempting to load new ViewModel from Intent with Extras
[Mono] Assembly Ref addref MvvmCross.Droid.Support.V7.AppCompat[0xac1787c0] -> System[0xac253020]: 13
[art] Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
[Mono] [0x97cba930] worker finishing
[] suspend_thread suspend took 201 ms, which is more than the allowed 200 ms
[libc] Fatal signal 6 (SIGABRT), code -6 in tid 6991 (Threadpool work)
Ich habe ein Beispiel auf GitHub: https://github.com/andrestalavera/MvvmCrossTabsSample –