无法在android的mono选项卡之间切换
我有两个片段和一个活动。 ChatFragment和UserListFragment。ChatActivity是我编写了愚蠢代码的启动活动无法在android的mono选项卡之间切换,android,for-loop,mono,Android,For Loop,Mono,我有两个片段和一个活动。 ChatFragment和UserListFragment。ChatActivity是我编写了愚蠢代码的启动活动 protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.QChatLayout); var newFragment =
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.QChatLayout);
var newFragment = new UserFragment(this, this);
var ft = FragmentManager.BeginTransaction();
ft.Add(Resource.Id.Frame_container, newFragment);
ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
var homeTab = ActionBar.NewTab();
homeTab.SetTabListener(
new TabListener<UserFragment>(newFragment));
homeTab.SetText("Users");
// Add the new tab to the action bar
ActionBar.AddTab(homeTab);
ft.Commit();
}
protectedoverride void OnCreate(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.QChatLayout);
var newFragment=newuserfragment(this,this);
var ft=FragmentManager.BeginTransaction();
ft.Add(Resource.Id.Frame_容器,newFragment);
ActionBar.NavigationMode=ActionBarNavigationMode.Tabs;
var homeTab=ActionBar.NewTab();
homeTab.SetTabListener(
新TabListener(newFragment));
homeTab.SetText(“用户”);
//将新选项卡添加到操作栏
ActionBar.AddTab(homeTab);
ft.Commit();
}
它使用UserFragment显示可用用户的列表
当我点击其中一个用户时,chatt窗口在新选项卡中打开,该选项卡只是ChatFragment
要打开新窗口,我将在ActionBar中添加选项卡
User user = GetUserByName(userName);
ChatFragment chatFragment = null;
Fragment fragment = FragmentManager.FindFragmentByTag(user.Name);
var ft = FragmentManager.BeginTransaction();
if (fragment == null)
{
chatFragment = new ChatFragment(context, activity);
chatFragment.User = user;
chatFragment.CurrentUser = Global.Host.Username;
Global.ChatWindows.Add(chatFragment);
ft.SetBreadCrumbTitle(user.Name);
ft.Add(Resource.Id.Frame_container, chatFragment, user.Name);
var homeTab = this.activity.ActionBar.NewTab();
homeTab.SetTabListener(
new TabListener<ChatFragment>(fragment));
homeTab.SetIcon(Resource.Drawable.QChatOffline);
homeTab.SetText(userName);
// Add the new tab to the action bar
this.activity.ActionBar.AddTab(homeTab); }
else
{
chatFragment = (ChatFragment)fragment;
}
ft.Commit();
chatFragment.ShowMessage(String.Format("{0} is {1}.", user.Name, m_chatWindowManager.GetStatusText(user.Status)), MessageType.Status);
User=GetUserByName(用户名);
ChatFragment ChatFragment=null;
Fragment Fragment=FragmentManager.FindFragmentByTag(user.Name);
var ft=FragmentManager.BeginTransaction();
if(片段==null)
{
chatFragment=新的chatFragment(上下文、活动);
chatFragment.User=User;
chatFragment.CurrentUser=Global.Host.Username;
Global.ChatWindows.Add(chatFragment);
ft.title(用户名);
ft.Add(Resource.Id.Frame_容器,chatFragment,user.Name);
var homeTab=this.activity.ActionBar.NewTab();
homeTab.SetTabListener(
新的TabListener(片段);
homeTab.SetIcon(Resource.Drawable.QChatOffline);
homeTab.SetText(用户名);
//将新选项卡添加到操作栏
this.activity.ActionBar.AddTab(homeTab);}
其他的
{
chatFragment=(chatFragment)片段;
}
ft.Commit();
ShowMessage(String.Format(“{0}是{1}.”),user.Name,m_chatWindowManager.GetStatusText(user.Status)),MessageType.Status);
我使用了tablistner类:
public class TabListener<T> : Java.Lang.Object, ActionBar.ITabListener
where T : Fragment, new()
{
private T _fragment;
/// <summary>
/// initializes a new instance of the tab listener
/// </summary>
public TabListener()
{
_fragment = new T();
}
/// <summary>
/// Initializes a new instance of the tab listener
/// </summary>
/// <param name="fragment"></param>
public TabListener(T fragment)
{
_fragment = fragment;
}
/// <summary>
/// Handles the reselection of the tab
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
{
}
/// <summary>
/// Adds the fragment when the tab was selected
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
//ft.Add(Resource.Id.Frame_container, _fragment, typeof(T).FullName);
//int index = Global.ChatWindows.FindIndex(c => c.User.Name == tab.Tag.ToString());
//Activity.ActionBar.SelectTab(Activity.ActionBar.GetTabAt(index + 1));
//ft.Show(_fragment);
//tab.Select();
//tab.Notify();
}
/// <summary>
/// Removes the fragment when the tab was deselected
/// </summary>
/// <param name="tab"></param>
/// <param name="ft"></param>
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
//ft.Remove(_fragment);
//ft.AddToBackStack(tab.Tag.ToString());
}
}
公共类TabListener:Java.Lang.Object、ActionBar.ITabListener
其中T:Fragment,new()
{
私人T_片段;
///
///初始化选项卡侦听器的新实例
///
公共TabListener()
{
_片段=新的T();
}
///
///初始化选项卡侦听器的新实例
///
///
公共TabListener(T片段)
{
_片段=片段;
}
///
///处理选项卡的重新选择
///
///
///
已重新选择公共void ontaber(ActionBar.Tab选项卡,FragmentTransaction ft)
{
}
///
///选择选项卡时添加片段
///
///
///
已选择的公共事务(ActionBar.Tab选项卡,FragmentTransaction ft)
{
//ft.Add(Resource.Id.Frame\u container,\u fragment,typeof(T).FullName);
//int index=Global.ChatWindows.FindIndex(c=>c.User.Name==tab.Tag.ToString());
//Activity.ActionBar.SelectTab(Activity.ActionBar.gettab(index+1));
//ft.Show(_片段);
//tab.Select();
//tab.Notify();
}
///
///取消选择选项卡时删除片段
///
///
///
已选择公共无效OnTab(ActionBar.Tab选项卡,FragmentTransaction ft)
{
//ft.移除(_碎片);
//ft.AddToBackStack(tab.Tag.ToString());
}
}
我应该写什么代码来选择和取消选择。
我无法在操作栏中的选项卡之间切换。
任何人都可以帮助解决这个问题。事实上事情很简单(我使用的是API级别14),记住,我称之为listener类SimpleTableListener
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
fragmentTransaction.Add(Resource.Id.fragment_container, fragment, typeof(T).Name);
}
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
fragmentTransaction.Remove(fragment);
}
我对你们的问题很感兴趣,因为我认为标签切换并不像android教程所演示的那个样正常工作。事实上,我在更新选项卡视图时犯了一个错误,在错误的方向上搜索解决方案浪费了几个小时。
我在stackoverflow上看到了你关于标签的其他问题,我想你也遇到了类似的情况;-)
编辑:事实上,在android 3.2中,当切换选项卡时,附加/分离似乎是一个更好的主意,因为片段保存在FragmentManager中,视图被删除。
以前的方法是:
public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
// Allows the view to be refreshed
fragmentTransaction.Detach(fragment);
fragmentTransaction.Attach(fragment);
}
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
if (fragment == null)
{
fragment = Fragment.Instantiate(context, typeof(T).Namespace.ToLower() + "." + typeof(T).Name);
fragmentTransaction.Add(Resource.Id.fragment_container, fragment);
}
else
{
fragmentTransaction.Attach(fragment);
}
}
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
if (fragment != null)
{
fragmentTransaction.Detach(fragment);
}
}
关于这个主题我非常感兴趣。我在自我挖掘之后就完成了………另外,请查看此官方教程: