Xamarin Android在Fragment中调用Fragment

问题描述 投票:1回答:1

我的代码有些问题。我正试图在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?

listview xamarin.android fragment
1个回答
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的整个内容,qazxswpoi是你想要在点击其中一个ListView项目时显示的片段。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.