片段显示/隐藏根本不起作用

时间:2014-07-22 07:54:05

标签: android android-fragments

我一直在尝试构建一个Android应用程序,以便了解片段背后的基本概念。但我完全无法显示和隐藏片段。
这是我的onClickListner代码

final FragmentManager fragmentManager = getFragmentManager();

b.setOnClickListener(new View.OnClickListener() {

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onClick(View v) {
        FragmentTransaction ft = fragmentManager.beginTransaction();

        PM_Fragment pm_fragment = new PM_Fragment();
        ft.replace(android.R.id.content, pm_fragment);

        if (pm_fragment.isHidden()) {
            fragmentManager.beginTransaction()
                    .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
                    .show(pm_fragment)
                    .commit();

            b.setText("Hide");
        } else {
            fragmentManager.beginTransaction()
                    .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
                    .hide(pm_fragment)
                    .commit();
            b.setText("Show");
        }
    }
});

在我的案例中,片段只是一个文本行。按钮应该做的是切换片段的可见性。 谁能告诉我这段代码有什么问题?
如果不工作,我的意思是按钮在点击时什么都不做,除了从"隐藏"到"显示"然后它会保持"显示",无论你点击它多少次。而这个过程对片段的行为完全没有影响。

1 个答案:

答案 0 :(得分:1)

我真的不明白你在这里要做什么,但你永远不会提交ft所以你的Fragment永远不会被添加到Activity。我也不明白两个内在FragmentTransaction的目的,但是除了说你完全不需要

之外

全球定义:

private PM_Fragment pmFragment = new PM_Fragment();

您的OnClickListener应如下所示:

b.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

        if(pmFragment.isAdded()) {
            ft.remove(pmFragment);
        } else {
            ft.replace(android.R.id.content, pmFragment);
        }

        ft.commit();
    }
});

重要:要使FragmentTransactions生效,必须在代码中添加Fragment!如果您以XML格式添加它们,那么它们就不会受FragmentTransactions的影响!因此,如果像这样添加Fragment

<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="at.example.fragments.SomeFragment" />

或者使用其他类似的方法,我确信这至少是问题的一部分。您需要仅在以下代码中添加Fragment

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        SomeFragment fragment = SomeFragment.newInstance();

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.flFragmentContainer, fragment);
        transaction.commit();
    }
}

只需在布局中将<fragment />标记替换为以下内容:

<FrameLayout 
    android:id="@+id/flFragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

它将作为您要添加的Fragment的容器。您可以使用上面的FragmentTransactionFragment添加到此FrameLayout