Um dies zu erreichen, müssen Sie einige Änderungen an Ihrem Code vornehmen.
Zuerst muss der ViewPager von der Aktivität (MainActivity) in ein Fragment verschoben werden, nennen Sie es RootTabFragment oder was auch immer Sie mögen.
In Ihrem MainActivity Sie eine Instanz dieser RootTabFragment schaffen:
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
ist nur ein FrameLayout in meinem main.xml Layout
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/containerLayout"
android:layout_height="match_parent" />
Wie zuvor angedeutet Ihre ViewPager muss verschoben werden zu einem Fragment. Hier werden Sie alle Tab-Logik wie zuvor in Ihrer MainActivity durchführen.
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;
}
Es ist ein wenig ändern, wenn Sie es bemerken bekommen, sind wir nicht gonna verwenden die SupportFragmentManager
stattdessen werden wir die ChildFragmentManager
verwenden. Sie müssen in Ihrer Adapter-Klasse keine Änderungen vornehmen, da beide Klassen von FragmentManager
abgeleitet sind.
Hinweis: Ich verwende ein TabLayout in diesem Beispiel, aber Sie sind gut, diesen Teil des Codes zu entfernen, wenn Sie es nicht benötigen.
Jetzt in Ihrem customFragment2 Klasse
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();
}
Dadurch wird der gesamte Inhalt Ihrer Resource.Id.containerLayout
ersetzen, die mit Ihrem FragmentYouWantToNavigateTo
in Ihrem MainActivity Layout ist, die das Fragment Sie zeigen möchten, wenn auf einem der Listview-Elemente klicken .
Hoffe, das hilft!
Danke für diese detaillierte Antwort !!! Ich kann ChildFragmentManager nicht wirklich verwenden, da ich in meinem Adapter Android.support.v4.App verwende. Es gibt also Konvertierungsprobleme. Vielleicht muss ich einen Code in meinem Adapter ändern? EDIT: Ich muss nur Android v4 in Fragment verwenden ... sry für das – Korken55
In diesem Beispiel habe ich auch Android.Support.V4.App verwendet. Stellen Sie nur sicher, dass Ihr Adapter-Konstruktor als Parameter einen 'FragmentManager' und keinen' SupportFragmentManager' verwendet, so dass Sie auf diese Weise den 'ChildFragmentManager' verwenden können. – apineda
Danke, das funktioniert so weit, aber wenn ich auf ein Element klicke, sind die Tabs weg + wenn ich die Hardware-Zurück-Taste drücke, stürzt meine App ab. Irgendeine Idee, warum das passiert? – Korken55