2017-02-18 4 views
1

Ich habe ein paar Probleme mit meinem Code. Ich versuche ein Fragment in einem Tab-Fragment zu benennen.Xamarin Android Anruf ein Fragment in einem Fragment

So habe ich meine Mainactivity, wo ich Registerkarten wie folgt erstellen:

private void initVp(ViewPager viewPager) 
     { 
      var pagerAdapter = new PagerAdapter(SupportFragmentManager); 
      pagerAdapter.addFragment(new customFragment1(),new Java.Lang.String("Frag1")); 
      pagerAdapter.addFragment(new CustomFragment2(), new Java.Lang.String("Frag2")); 
      viewPager.Adapter = pagerAdapter; 
     } 

In meinem CustomFragment2 Ich habe eine Listview mit Artikel:

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) 
    { 
     // What I have to do here? 
    } 

ich die Details der angezeigt werden soll Artikel, auf den ich in einem neuen Fragment unter der Registerkarte "Frag2" geklickt habe. Also, wie kann ich ersetzen oder zeigen, dass Details unter meinem Tab statt CustomFragment2?

Antwort

1

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!

+0

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

+0

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

+0

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

Verwandte Themen