Android 片段上的SetSupportActionBar未设置SupportActionBar

Android 片段上的SetSupportActionBar未设置SupportActionBar,android,android-layout,android-fragments,xamarin.android,mvvmcross,Android,Android Layout,Android Fragments,Xamarin.android,Mvvmcross,下面是MvvmCross的示例,并尝试重构我自己的应用程序,以将AppBar和工具栏资源定义移动到片段中。我在片段上调用SetSupportActionbar时遇到问题,而调用在活动中正常工作。以下是重构后的代码: activity_main.axml MainActivity.cs 使用Android.App; 使用Android.OS; 使用Android.Content.PM; 使用MvvmCross.Droid.Support.V7.AppCompat; 使用Mobile.Core.

下面是MvvmCross的示例,并尝试重构我自己的应用程序,以将AppBar和工具栏资源定义移动到片段中。我在片段上调用SetSupportActionbar时遇到问题,而调用在活动中正常工作。以下是重构后的代码:

activity_main.axml


MainActivity.cs

使用Android.App;
使用Android.OS;
使用Android.Content.PM;
使用MvvmCross.Droid.Support.V7.AppCompat;
使用Mobile.Core.ViewModels;
命名空间Mobile.Droid.Activities
{
[活动(
Label=“@string/applicationName”,
Icon=“@drawable/ic_Icon”,
Theme=“@style/AppTheme.Default”,
LaunchMode=LaunchMode.SingleTop,
ScreenOrientation=ScreenOrientation.肖像,
Name=“droid.mobile.activities.MainActivity”)]
公共类MainActivity:MvxAppCompatActivity
{
...    
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
ViewModel.ShowLists();
}
....
}
}
fragment_lists.axml


ListsFragment.cs

使用Android.OS;
使用Android.Views;
使用MvvmCross.Droid.Support.V4;
使用MvvmCross.Binding.Droid.BindingContext;
使用Android.Runtime;
使用List.Mobile.Droid.Common;
使用MvvmCross.Binding.BindingContext;
使用Android.Support.V4.View;
使用Android.Widget;
使用List.Mobile.Core.ViewModels;
使用MvvmCross.Droid.Support.V7.RecyclerView;
使用Android.Support.V7.Widget;
使用MvvmCross.Droid.Views.Attributes;
命名空间List.Mobile.Droid.Views
{
[MvxFragmentPresentation(typeof(MainViewModel),Resource.Id.main\u content\u frame,true)]
[注册(“list.mobile.droid.views.ListsFragment”)]
公共类ListsFragment:BaseFragment,ActionMode.ICallback
{
...    
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
base.OnCreateView(充气机、容器、保存状态);
...
}
}
}
BaseFragment.cs

使用MvvmCross.Droid.Support.V4;
使用List.Mobile.Droid.Common;
使用MvvmCross.Core.ViewModels;
使用Android.OS;
使用Android.Views;
使用Android.Support.Design.Widget;
使用Android.Support.V7.Widget;
使用Android.Support.V7.App;
命名空间List.Mobile.Droid.Views
{
公共抽象类BaseFragment:MvxFragment,其中T:MvxViewModel
{    
受保护的AppBarLayout AppBar{get;set;}
受保护的FloatingActionButton FAB{get;set;}
受保护的工具栏{get;set;}
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
var view=base.OnCreateView(充气机、容器、savedInstanceState);
AppBar=Activity.findviewbyd(Resource.Id.main\u app\u bar);
FAB=Activity.findviewbyd(Resource.Id.FAB);
工具栏=Activity.findviewbyd(Resource.Id.main\u工具栏);
AppCompatActivity parentActivity=((AppCompatActivity)活动);
parentActivity.SetSupportActionBar(工具栏);
parentActivity.SupportActionBar.SetDisplayHomeAsupaned(false);
parentActivity.SupportActionBar.SetHomeButtonEnabled(false);
返回视图;
}
}
}
问题在于线路:

parentActivity.SetSupportActionBar(Toolbar);

因为它似乎没有设置操作栏以及对parentActivity.SupportActionBar的后续调用,因此失败并出现NullReferenceException。有什么想法吗?当Appbar和Toolbar是在活动中定义的,而不是在片段中定义的时候,请不要认为这是有效的。

如果你看不到答案,休息一下,喝杯咖啡,它就会来找你。由于AppBar和工具栏是在片段XML中定义的,因此我无法调用Activity.FindViewById()使其膨胀。上述代码同样适用于AppBar和FAB。一旦我重构了代码,使其更接近我所遵循的上述示例(子类Fragment提供了片段布局的ResourceId,基类将其膨胀),我就能够更改调用:

AppBar=Activity.findviewbyd(Resource.Id.main\u app\u bar);
Fab=Activity.findviewbyd(Resource.Id.Fab);
工具栏=Activity.findviewbyd(Resource.Id.main\u工具栏);
致:

一切开始都很顺利

AppBar = FragmentView.FindViewById<AppBarLayout>(Resource.Id.main_app_bar);
Fab = FragmentView.FindViewById<FloatingActionButton>(Resource.Id.fab);
Toolbar = FragmentView.FindViewById<Toolbar>(Resource.Id.main_tool_bar);
FragmentView = this.BindingInflate(FragmentResourceId, null);