为什么FragmentTransaction.hide()不隐藏我的片段?

时间:2013-12-20 12:23:35

标签: android android-fragments

我正在制作一个使用操作栏标签的Android应用程序(我正在使用支持库的操作栏),每个都与我动态生成的片段相关联。

这个想法是在使用FragmentTransaction.show()选择其选项卡时显示片段,并使用FragmentTransaction.hide()隐藏取消选择的选项卡,但是当我这样做时,“隐藏”片段会变得稍微变灰。

UI通过灰化隐藏标签表明某些内容有所不同这一事实可能表明这是故意行为,但我认为hide()实际上隐藏了标签。

我做错了什么,我该怎么办?如有必要,标签监听器的代码如下:

public class VarientTabListener implements ActionBar.TabListener
{
    VarientFragment Arch_Fragment;
    VarientFragment Plane_Fragment;
    ActionBarActivity parent;

    public VarientTabListener(ActionBarActivity act)
    {
        parent = act;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
    {
        //Work out which tab was selected
        if (tab.getText() == "Arch_Tab")
        {
            //Create the tab if it doesn't exist
            if (Arch_Fragment == null)
            {
                Arch_Fragment = (VarientFragment) Fragment.instantiate(parent, VarientFragment.class.getName());
                ft.add(android.R.id.content, Arch_Fragment, "Arch");
            }
            //Otherwise show it
            else
            {
                ft.show(Arch_Fragment);
            }
        }
        else if (tab.getText() == "Plane_Tab")
        {
            if (Plane_Fragment == null)
            {
                Plane_Fragment = (VarientFragment) Fragment.instantiate(parent, VarientFragment.class.getName());
                ft.add(android.R.id.content, Plane_Fragment, "Plane");
            }
            else
            {
                ft.show(Plane_Fragment);
            }
        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
    {
        if (tab.getText() == "Arch_Tab")
        {
            if (Arch_Fragment != null)
            {
                //Hide the unselected tab
                ft.hide(Arch_Fragment);
            }

        }
        else if (tab.getText() == "Plane_Tab")
        {
            if (Plane_Fragment != null)
            {
                ft.hide(Plane_Fragment);
            }
        }
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
    {

    }
}

3 个答案:

答案 0 :(得分:3)

你需要提交片段

ft.hide(Arch_Fragment);
ft.commit();

答案 1 :(得分:2)

因为你正在以错误的方式比较字符串。不要将字符串与==运算符进行比较。

使用equals()方法比较字符串......

if (tab.getText().equals("Arch_Tab")) {
    if (Arch_Fragment != null) {
        //Hide the unselected tab
         ft.hide(Arch_Fragment);
    }
 }

答案 2 :(得分:1)

虽然我没有真正解决这个问题,但解决方法是简单地获取一个新的FragmentTransaction并在最后提交,忽略您作为参数传递的事务。

例如对于onTabUnselected方法:

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft_unused)
{
    FragmentTransaction ft = parent.getSupportFragmentManager().beginTransaction();
    if (tab.getText() == "Arch_Tab")
    {
        if (Arch_Fragment != null)
        {
            //Hide the unselected tab
            ft.hide(Arch_Fragment);
        }

    }
    else if (tab.getText() == "Plane_Tab")
    {
        if (Plane_Fragment != null)
        {
            ft.hide(Plane_Fragment);
        }
    }
    ft.commit();
}