我目前有一个Android应用,它在导航区域中有几个标签(确切地说是3个)。单击每个选项卡可显示与选项卡关联的片段。
我希望能够单击显示的片段中的按钮并显示一个新片段,该片段不属于任何选项卡。基本上,它就像是上一页的子屏幕。
我能够显示“子片段”,点击后退按钮会将我带到上一个片段,这就是我想要的。
我的问题是当我点击另一个标签时,“子片段”不会消失。如果我单击后退按钮,我会收到IllegalStateException,说已经添加了Fragment1。
以下是一些希望有助于回答我的问题的代码。
MainActivity:
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
string tabTag = tab.Tag.ToString();
Fragment f = FragmentManager.FindFragmentByTag(tabTag);
if (f != null)
{
ft.Show(f);
}
else
{
switch (tabTag)
{
case "Tab1":
f = new Fragment1();
break;
case "Tab2":
f = new Fragment2();
break;
case "Tab3":
f = new Fragment3();
break;
default:
f = new NotImplementedTabFragment();
break;
}
ft.Add(Resource.Id.fragmentContainer, f, tabTag);
}
}
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
string tabTag = tab.Tag.ToString();
Fragment f = FragmentManager.FindFragmentByTag(tabTag);
if (f != null)
{
ft.Hide(f);
}
}
片段1:
public class Fragment1 : Fragment
{
public override Android.Views.View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
var view = inflater.Inflate(Resource.Layout.Fragment1, container, false);
return view;
}
protected void OnButtonClick(object sender, Android.Widget.AdapterView.ItemClickEventArgs e)
{
var t = items[e.Position].ToString();
FragmentTransaction fragmentTransaction = FragmentManager.BeginTransaction();
fragmentTransaction.Replace(Resource.Id.fragmentContainer, new SubFragment());
fragmentTransaction.AddToBackStack(null);
fragmentTransaction.Commit();
}
}
这是用Xamarin(C#)编写的,但我确实理解Java代码,所以使用Java的任何帮助/示例都很好。
更新
我意识到我的MainActivityLayout.axml文件使用的是RelativeLayout而不是FrameLayout,这就是我必须使用attach / detach而不是show / hide的原因。这是我的新布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
它仍然没有按预期工作,但我不再得到例外,说片段已被添加。
更新2:
我决定废弃尝试使用OnTabSelected和OnTabUnselected而只使用委托,因为我正在使用C#。重要的代码是:
private void AddTab(Tab tab, Fragment fragment)
{
Android.App.ActionBar.Tab droidTab = this.ActionBar.NewTab();
droidTab.SetCustomView(new TabLayout(this));
droidTab.SetTag(tab.ToString());
droidTab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e)
{
e.FragmentTransaction.Replace(Resource.Id.fragmentContainer, fragment);
};
this.ActionBar.AddTab(droidTab);
}
答案 0 :(得分:0)
我认为您需要做的是保存对SubFragment的引用
Fragment subFrag;
protected void OnButtonClick(object sender, Android.Widget.AdapterView.ItemClickEventArgs e)
{
var t = items[e.Position].ToString();
FragmentTransaction fragmentTransaction = FragmentManager.BeginTransaction();
subFrag = new SubFragment();
fragmentTransaction.Replace(Resource.Id.fragmentContainer, subFrag);
fragmentTransaction.AddToBackStack(null);
fragmentTransaction.Commit();
}
然后在分离Fragment1时,删除subFrag
@Override public void onDetach() {
if (subFrag != null) {
FragmentTransaction fragmentTransaction = FragmentManager.BeginTransaction();
fragmentTransaction.Remove(subFrag );
fragmentTransaction.Commit();
}
super.onDetach();
}
另一个(虽然我认为有点粗糙)选项可能是在Fragment1中实现getSubFragment()
方法并执行:
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
string tabTag = tab.Tag.ToString();
Fragment f = FragmentManager.FindFragmentByTag(tabTag);
if (f instanceof Fragment1) {
Fragment subFrag = ((Fragment1)f).getSubFragment();
if (subFrag != null) {
ft.Remove(f);
}
}
if (f != null)
{
ft.Hide(f);
}
}