我目前有一个Android应用程序,在导航区域中有几个选项卡(确切地说是3个)。点击每个标签显示与该标签关联的片段。Android ActionBar.Tab,碎片,子片段
我希望能够点击正在显示并显示一个新片段的按钮,该片段不是任何选项卡的一部分。基本上,它就像前一页的子屏幕。
我能够得到“子片段”来显示,点击后退按钮将带我到我想要的前一个片段。
我的问题是,当我点击另一个选项卡时,“子片段”不会消失。如果我点击后退按钮,我会得到一个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文件使用的FrameLayout的RelativeLayout的替代,这就是为什么我不得不使用安装/拆卸,而不是显示/隐藏。这是我的新布局:
<?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);
}
我已经实现了你所说的做,但onDetach永远不会被调用。 据Dianne Hackborn在https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg - “不,它有点不幸命名,onDetach()意味着从活动中分离出来。仍然附着在活动上,FragmentManager.detach()基本上把它放到与在栈上压入时相同的状态。“ –
您是否尝试将其移动到生命周期的另一部分,例如onDestroyView或onPause? – cYrixmorten
查看我的更新。我使用RelativeLayout而不是FrameLayout来存储片段。代码不工作我真的很想要它,它不会让SubFragment在单击其他选项卡时消失,但其他片段的内容显示出来。有点像分层效果。 –