2016-10-01 89 views
0

我尝试做DrawerLayout不能转换为android.support.v4.app.Fragment(Xamarin C#)

但我面临的问题

Java.Lang.ClassCastException: tieit.droid.MyListFragment cannot be cast to android.support.v4.app.Fragment 

这是我在MainViewModel代码代码:

using MvvmCross.Core.ViewModels; 
using System; 
using System.Collections.Generic; 

namespace TieiT.Core 
{ 
    public class MainViewModel : MvxViewModel 
    { 
     readonly Type[] _menuItemTypes = { 
      typeof(MyListViewModel), 
      typeof(MySettingsViewModel), 
     }; 

     public IEnumerable<string> MenuItems { get; private set; } = new [] { "My List", "My Settings" }; 

     public void ShowDefaultMenuItem() 
     { 
      NavigateTo (0); 
     } 

     public void NavigateTo (int position) 
     { 
      ShowViewModel (_menuItemTypes [position]); 
     } 
    } 

    public class MenuItem : Tuple<string, Type> 
    { 
     public MenuItem (string displayName, Type viewModelType) 
      : base (displayName, viewModelType) 
     {} 

     public string DisplayName 
     { 
      get { return Item1; } 
     } 

     public Type ViewModelType 
     { 
      get { return Item2; } 
     } 
    } 
} 

当我的错误,它hightlights这样:

public void NavigateTo (int position) 
    { 
     ShowViewModel (_menuItemTypes [position]); 
    } 

这里是MyListFragment:

using Android.OS; 
using Android.Runtime; 
using Android.Views; 

using MvvmCross.Droid.Shared.Attributes; 
using MvvmCross.Droid.FullFragging.Fragments; 


using TieiT.Core; 

namespace TieiT.Droid 
{ 
    [MvxFragmentAttribute(typeof(MainViewModel), Resource.Id.frameLayout)] 
    [Register("tieit.droid.MyListFragment")] 
    public class MyListFragment : MvxFragment<MyListViewModel> 
    { 
     public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      return inflater.Inflate(Resource.Layout.MyListView, container, false); 
     } 
    } 
} 

这里是我的活动,我需要证明DrawerLayout

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using MvvmCross.Droid.Support.V7.AppCompat; 
using TieiT.Droid; 
using Android.Support.V7.App; 
using Android.Support.V4.Widget; 
using Toolbar = Android.Support.V7.Widget.Toolbar; 
using Fragment = Android.Support.V4.App.Fragment; 

using TieiT.Core; 

namespace TieiT.Droid.Views 
{ 
    [Activity] 
    public class GeneralInfo : MvxCachingFragmentCompatActivity<MainViewModel> 
    { 

     ActionBarDrawerToggle _drawerToggle; 

     ListView _drawerListView; 

     DrawerLayout _drawerLayout; 

     protected override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      SetContentView(Resource.Layout.GeneralInfoPage); 
      var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); 
      SetSupportActionBar(toolbar); 

      SupportActionBar.SetDisplayHomeAsUpEnabled(false); 

      _drawerListView = FindViewById<ListView>(Resource.Id.drawerListView); 
      _drawerListView.ItemClick += (s, e) => ShowFragmentAt(e.Position); 
      _drawerListView.Adapter = new ArrayAdapter<string>(this, global::Android.Resource.Layout.SimpleListItem1, ViewModel.MenuItems.ToArray()); 

      _drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawerLayout); 

      _drawerToggle = new ActionBarDrawerToggle(this, _drawerLayout, Resource.String.OpenDrawerString, Resource.String.CloseDrawerString); 

      _drawerLayout.SetDrawerListener(_drawerToggle); 

      ShowFragmentAt(0); 
     } 

     void ShowFragmentAt(int position) 
     { 
      ViewModel.NavigateTo(position); 

      Title = ViewModel.MenuItems.ElementAt(position); 

      _drawerLayout.CloseDrawer(_drawerListView); 
     } 

     protected override void OnPostCreate(Bundle savedInstanceState) 
     { 
      _drawerToggle.SyncState(); 

      base.OnPostCreate(savedInstanceState); 
     } 

     public override bool OnOptionsItemSelected(IMenuItem item) 
     { 
      if (_drawerToggle.OnOptionsItemSelected(item)) 
       return true; 

      return base.OnOptionsItemSelected(item); 
     } 
    } 
} 

我如何解决这个错误?

感谢您的帮助。

UPDATE

我主要布局:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
<!-- content must go before menu because of z-order --> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
     <include 
      layout="@layout/toolbar" /> 
     <FrameLayout 
      android:id="@+id/frameLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </LinearLayout> 
<!-- menu --> 
    <ListView 
     android:id="@+id/drawerListView" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:background="?android:attr/windowBackground" /> 
</android.support.v4.widget.DrawerLayout> 

这里是我的控制台:

[ERROR] FATAL UNHANDLED EXCEPTION: Java.Lang.ClassCastException: tieit.droid.MyListFragment cannot be cast to android.support.v4.app.Fragment 
10-01 19:52:15.838 E/mono-rt (3039): --- End of managed Java.Lang.ClassCastException stack trace --- 
10-01 19:52:15.838 E/mono-rt (3039): java.lang.ClassCastException: tieit.droid.MyListFragment cannot be cast to android.support.v4.app.Fragment 
+0

请添加您的布局xml和堆栈跟踪到问题。 –

+0

更新的帖子@StefanWanitzek – Eugene

回答

1

你装错了包装,becouse的MvvmCross.Droid.FullFragging只支持Fragment,当您尝试投射时会出现错误。当使用Android.Support.V4.App.Fragment时,应该安装MvvmCross.Droid.Support.V7.Fragging'MvvmCross.Droid.V7.AppCompat'

相关问题