我的代码存在一些问题。我正试图在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?
答案 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项目时要显示的片段。
希望这有帮助!