2017-02-18 110 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我有项目列表视图:

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)移到Fragment,称之为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只是在我main.xml中布局的FrameLayout

<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。您无需对Adapter类进行任何更改,因为这两个类都源自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(); 
} 

这将取代你想在ListView的项目之一,当点击,以显示你的Resource.Id.containerLayout这与你的FragmentYouWantToNavigateTo您的MainActivity布局,是片段的全部内容。

希望这会有所帮助!

+0

感谢您的详细答案!我实际上不能使用ChildFragmentManager,因为在我的适配器中我使用Android.support.v4.App。所以有转换问题。也许我必须改变我的适配器中的一些代码?编辑:我只需要在片段中使用Android v4 ... sry那 – Korken55

+0

在这个例子中我也使用了Android.Support.V4.App。只要确保你的Adapter构造函数将'FragmentManager'作为一个参数,而不是'SupportFragmentManager',这样你就可以使用ChildFragmentManager。 – apineda

+0

感谢,迄今为止,这项工程,但如果我点击一个项目,选项卡消失+如果我按硬件后退按钮我的应用程序崩溃。任何想法为什么发生这种情况 – Korken55