2017-02-18 32 views
1

У меня есть некоторые проблемы с моим кодом. Я пытаюсь вызвать фрагмент внутри фрагмента вкладки.Xamarin Android вызывает фрагмент внутри фрагмента

Так у меня Mainactivity, где я могу создавать вкладки, как это:

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; 
     } 

В моем CustomFragment2 У меня есть Listview с пунктами:

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? 
    } 

Я хочу, чтобы показать подробную информацию о Элемент, который я нажал в новом фрагменте под вкладкой «Frag2». Итак, как я могу «заменить» или показать этот фрагмент деталей под моей вкладкой вместо CustomFragment2?

ответ

1

Чтобы получить эту работу, вам придется внести несколько изменений в свой код.

Во-первых, 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 ,

Надеюсь, это поможет!

+0

Спасибо за подробный ответ !!! Я не могу использовать ChildFragmentManager, потому что в моем адаптере я использую Android.support.v4.App. Таким образом, есть проблемы с конвертированием. возможно, мне нужно изменить код в моем адаптере? EDIT: Мне просто нужно использовать Android v4 в фрагменте ... sry для этого – Korken55

+0

В этом примере я также использовал Android.Support.V4.App. Просто убедитесь, что ваш конструктор Adapter принимает в качестве параметра 'FragmentManager', а не' SupportFragmentManager', поэтому вы можете использовать 'ChildFragmentManager'. – apineda

+0

Спасибо, это работает до сих пор, но если я нажму на элемент, вкладки уйдут +, если я нажму кнопку аппаратного возврата, мое приложение выйдет из строя. Любая идея, почему это происходит? – Korken55