Xamarin Android在Fragment中调用Fragment

时间:2017-02-18 17:38:12

标签: listview xamarin.android fragment

我的代码存在一些问题。我正试图在Tab Fragment中调用Fragment。

所以我有我的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 with Items:

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 个答案:

答案 0 :(得分: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 ();
}

这将使用您的Resource.Id.containerLayout替换MainActivity布局中FragmentYouWantToNavigateTo的整个内容,{{1}}是您在单击其中一个ListView项目时要显示的片段。

希望这有帮助!