我使用Xamarin和MvvmCross在Android中使用Tabs时出现问题。在第一次开始时,一切都很完美,当我离开并回来时问题就出现了。当我回到包含标签布局的片段时,它是空白的,直到我开始滑动,然后再次创建页面。
这似乎表明可以通过简单地调用Adapter.NotifyDataSetChanged()来修复它,但事实并非如此。我第一次创建它时运行的相同代码也会在我导航回视图时运行。
我的代码设置与this sample完全相同唯一的区别是我的MainView不包含选项卡,它是放置在包含选项卡布局的FragmentFrame中的子片段之一。
我的设置
使用Xamarin和MvvmCross的基本Android Fragment设置。我有一个带有片段框架的容器视图。我的所有片段都是MvxFragments,其上附有关联的属性,指示包含它们的viewmodel以及放置它们的帧的id。我使用默认的AndroidFragmentPresenter。
以前有没有人经历过这个。以下是我尝试过的一些事情:
将所有寻呼机和适配器设置移至UI线程
仅在当前适配器为空时创建并设置新适配器
OnViewCreated调用_adapter.NotifyDataSetChanged()
除了3之外,我还在适配器中对GetItemPosition进行了覆盖,并返回了PositionNone以重新加载所有项目。
在返回时将页面索引设置为不同的索引以强制滚动,但我只有3个页面,因此中间的索引永远不会再创建
在DestroyView上配置viewPager,adapter和tabLayout
编辑1:我添加了确切方案here的示例,这是我的生产代码的精简版本。当您按FAB并使用后退按钮返回时,您将看到选项卡适配器为空。这就是错误。
我也会添加我的代码,因为你不想看那个回购。
带标签的片段(布局)
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_margin="10dp"
android:gravity="center">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/simple_search_edit_text"
android:layout_width="match_parent"
android:layout_height="60dp"
android:paddingLeft="70dp"
android:hint="New Search"
android:textColorHint="@color/light_grey"
android:background="#fff"
android:imeOptions="actionSearch"
android:inputType="text"
local:MvxBind="Text SearchText" />
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_centerVertical="true"
android:padding="3dp"
local:srcCompat="@drawable/mag_glass_gray" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginRight="20dp"
android:padding="8dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
local:srcCompat="@drawable/general_cog_icon" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<android.support.design.widget.TabLayout
android:id="@+id/main_tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SampleTabsTabLayout" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/main_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
local:layout_behavior="@string/appbar_scrolling_view_behavior" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/simple_search_advanced_search_btn"
android:layout_width="wrap_content"
android:layout_height="@dimen/simplesearch_advancedsearch_height"
android:layout_marginBottom="@dimen/simplesearch_advanced_search_margin_bottom"
android:layout_above="@+id/simple_search_fab"
android:layout_centerHorizontal="true"
android:gravity="center"
android:textSize="@dimen/simplesearch_advanced_search_text_size"
android:textColor="@color/foundit_blue"
android:background="@android:color/transparent"
local:MvxBind="Click AdvancedSearchCommand; Text AdvancedSearchButtonText" />
<!-- Search Button -->
<android.support.design.widget.FloatingActionButton
android:id="@+id/simple_search_fab"
android:layout_width="@dimen/general_fab_dimensions"
android:layout_height="@dimen/general_fab_dimensions"
android:layout_marginBottom="@dimen/general_fab_margin_bottom"
android:padding="@dimen/simplesearch_fab_icon_padding"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:scaleType="centerInside"
android:src="@drawable/general_search_icon"
local:MvxBind="Click SearchCommand" />
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
片段查看代码
// Pager and adapter setup
var fragments = GetTabFragments();
var presenter = Mvx.Resolve<IMvxAndroidViewPresenter>() as AndroidViewPresenter;
_adapter = new SimpleSearchTabAdapter(Context, presenter.FragmentManager, fragments);
_fragmentPager.Adapter = _adapter;
_tabLayout.SetupWithViewPager(_fragmentPager);
// Just for completion sake of the code above
private List<MvxCachingFragmentStatePagerAdapter.FragmentInfo> GetTabFragments()
{
var fragments = new List<MvxCachingFragmentStatePagerAdapter.FragmentInfo>();
foreach (var tabViewModel in ViewModel.TabViewModels)
fragments.Add(new MvxCachingFragmentStatePagerAdapter.FragmentInfo(GetTabNameFromViewModel(tabViewModel),
GetViewTypeFromViewModel(tabViewModel),
tabViewModel));
return fragments;
}
答案 0 :(得分:0)
所以问题在于我正在使用片段中包含片段的Activity的FragmentManager而不是片段中的ChildFragmentManager。
来自this answer的有用信息