xamarin.android - 替换viewpager Mvvmcross中的片段
问题描述
tldr:如何使用 MvvmCross 替换 viewpager 中的片段?
我尝试使用如何替换 Viewpager 中的片段中描述的方法来替换 viewpager 中的片段。这个想法是在视图寻呼机中显示“RootFragment”。然而,它被第一个片段所取代。如果需要,也可以用第二个片段、第三个片段等替换。随着更多片段的添加,它们也被添加到后台堆栈中。
所以这将是“RootFragment”的代码片段
public class RootView : MvxFragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate(Resource.Layout.root_fragment, container, false);
var transaction = FragmentManager.BeginTransaction();
var fragment = FirstView.NewInstance();
transaction.Replace(Resource.Id.root_frame, fragment);
transaction.Commit();
return view;
}
}
然后,“第一个片段”的片段将是
[MvxFragmentPresentation(typeof(MainViewModel),
Resource.Id.root_frame, true)]
public class ScoringView : MvxFragment<FirstViewModel>
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
return this.BindingInflate(Resource.Layout.first_fragment, null);
}
}
“RootFragment”的布局是:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="#000"
android:layout_height="match_parent"
android:id="@+id/root_frame" />
“FirstViewModel”的代码是:
public class FirstViewModel: MvxViewModel
{
private IMvxAsyncCommand _openPreguntasCommand;
private IMvxNavigationService _navigationService;
public IMvxAsyncCommand OpenSecondCommand { get => _openSecondCommand?? (new MvxAsyncCommand(async () =>
{
await _navigationService
.Navigate<SecondViewModel>();
})); }
public FirstViewModel(IMvxNavigationService navigationService)
{
_navigationService = navigationService;
}
}
我尝试使用 PresentationHint 来完成这项任务。我修改了如何使用视图模型(导航服务)清除整个 Backstack 中使用的代码以满足我的需要,但无济于事。因此,也许自定义演示者可能是一种选择。我可以覆盖一个“OnBeforeFragmentChanging”或其他一些相关方法。我最终做的是使用 MvxFragmentPresentation 属性,并将 fragmentContentId 设置为“RootFragment”布局中占位符的 Id。但是,在我看来,必须有更好的方法。
[MvxFragmentPresentation(typeof(MainViewModel), Resource.Id.root_frame, true)]
解决方案
您是否尝试过 MvvmCross 源代码附带的 Playground 示例?有很好的片段实现
推荐阅读
- ios - 当设备方向为 faceDown 或 faceUp 时如何获取界面方向?
- firebase - Firebase 部署功能 - HTTP 错误 403
- git - 我如何明智地使用 master 重新设置一个非常大的过时分支?我可以在“阶段”中变基吗?
- javascript - 客户尚未被授予范围:读取角色
- android - 保存自动填充对话框未显示
- yii2 - 将文件上传到文件系统,然后将详细信息存储在数据表中
- javascript - 如何使用 puppeteer 输入美元金额?
- react-native - 世博会说 react-native 缺失
- python - 参数为函数的lambdified函数的Lambda
- alamofire - Alamofire 支持优先级吗?