0

2 つのフラグメントと 1 つのアクティビティがあります。ChatFragment と UserListFragment。ChatActivity は、愚かなコードを書いたスタートアップ アクティビティです。

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();
        }

UserFragment を使用して利用可能なユーザーのリストを表示します。ユーザーの 1 つをクリックすると、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);

私は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());
        }
    }

OnTabSelected と Deselected にどのコードを書くべきか。アクション バーでタブを切り替えることができません。誰でもこの問題を解決するのを手伝ってくれませんか。

4

1 に答える 1

1

物事は実際には簡単です (私は API レベル 14 で作業しています) SimpleTabListener

    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チュートリアルが示すように、タブの切り替えが正しく機能しないと思ったので、私はあなたの問題に興味を持っていました. 実際、タブ ビューを更新するときに間違いを犯し、解決策を間違った方向に探すのに数時間を費やしました。タブに関するスタックオーバーフローに関する他の質問を見ましたが、同様の状況にあったと思います;-) .

編集:実際には、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);
        }
    }

このブログ投稿は、この件に関して非常に興味深いものです。

于 2012-11-04T17:37:03.773 に答える