Чтобы получить эту работу, вам придется внести несколько изменений в свой код.
Во-первых, ViewPager необходимо перенести из Activity (MainActivity) в фрагмент, вызвать его RootTabFragment или что угодно.
В вашем MainActivity вы будете создавать экземпляр этого RootTabFragment:
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
var rootFragment = new RootTabFragment();
SupportFragmentManager
.BeginTransaction()
.Add (Resource.Id.containerLayout, rootFragment)
.Commit();
}
Resource.Id.containerLayout
просто FrameLayout в моем макете main.xml
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/containerLayout"
android:layout_height="match_parent" />
Как указывалось ранее ваш ViewPager должен быть перемещен к фрагменту. Здесь вы будете делать всю логику Tab, как раньше, в своем MainActivity.
public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate (Resource.Layout.RootTabFragment, container, false);
var pager = view.FindViewById<ViewPager> (Resource.Id.viewPager);
var tabLayout = view.FindViewById<TabLayout> (Resource.Id.tabs);
var adapter = new PagerAdapter (ChildFragmentManager);
adapter.AddFragment (new customFragment1(), "Fragment A");
adapter.AddFragment (new customFragment2(), "Fragment B");
pager.Adapter = adapter;
tabLayout.SetupWithViewPager (pager);
return view;
}
Там немного изменить, если вы получите, чтобы заметить это, мы не будем использовать SupportFragmentManager
вместо этого мы будем использовать ChildFragmentManager
. Вам не нужно вносить изменения в свой класс адаптера, поскольку оба класса производны от FragmentManager
.
Примечание: Я использую TabLayout в этом примере, но вы можете удалить эту часть кода, если вам это не нужно.
Теперь в вашем классе customFragment2
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
root = inflater.Inflate(Resource.Layout.CustomFragment2, container, false);
var adapter = new ListViewAdapter(this.Context, myList);
listView = root.FindViewById<ListView>(Resource.Id.listView);
listView.Adapter = adapter;
listView.ItemClick += showDetail;
return root;
}
void showDetail(object sender, AdapterView.ItemClickEventArgs e)
{
Activity
.SupportFragmentManager
.BeginTransaction()
.Replace (Resource.Id.containerLayout, new FragmentYouWantToNavigateTo())
.AddToBackStack(null)
.Commit();
}
Это заменит все содержимое вашего Resource.Id.containerLayout
, который находится в вашем MainActivity макет с вашей FragmentYouWantToNavigateTo
который является фрагмент, который вы хотите показать, при нажатии на один из элементов ListView ,
Надеюсь, это поможет!
Спасибо за подробный ответ !!! Я не могу использовать ChildFragmentManager, потому что в моем адаптере я использую Android.support.v4.App. Таким образом, есть проблемы с конвертированием. возможно, мне нужно изменить код в моем адаптере? EDIT: Мне просто нужно использовать Android v4 в фрагменте ... sry для этого – Korken55
В этом примере я также использовал Android.Support.V4.App. Просто убедитесь, что ваш конструктор Adapter принимает в качестве параметра 'FragmentManager', а не' SupportFragmentManager', поэтому вы можете использовать 'ChildFragmentManager'. – apineda
Спасибо, это работает до сих пор, но если я нажму на элемент, вкладки уйдут +, если я нажму кнопку аппаратного возврата, мое приложение выйдет из строя. Любая идея, почему это происходит? – Korken55