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

Android 片段显示/隐藏根本不起作用,android,android-fragments,Android,Android Fragments,为了理解片段背后的基本概念,我一直在尝试构建一个android应用程序。但我完全无法显示和隐藏片段这是我的onClickListner代码 final FragmentManager fragmentManager = getFragmentManager(); b.setOnClickListener(new View.OnClickListener() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onCl

为了理解片段背后的基本概念,我一直在尝试构建一个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");
        }
    }
});
在我的例子中,Fragment只是一个文本行。按钮的作用是切换片段的可见性。 有人能告诉我这个代码有什么问题吗?

我所说的不工作,是指当点击按钮时,除了将其文本从“隐藏”更改为“显示”之外,它什么也不做,并且在这之后,无论你点击多少次,它都会保持“显示”。这个过程对片段的行为没有任何影响。

我真的不明白你在这里想做什么,但是你从来没有提交过
ft
,所以你的
片段从来没有添加到
活动中。我也不明白两个内部
片段事务的目的,但可以说您根本不需要它们

在全球范围内定义:

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();
    }
});
<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="at.example.fragments.SomeFragment" />
@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();
    }
}
重要信息:要使
片段事务
正常工作,必须在代码中添加
片段
!如果在XML中添加它们,则它们不会受到
碎片事务的影响!因此,如果像这样添加您的
片段

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();
    }
});
<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="at.example.fragments.SomeFragment" />
@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();
    }
}
只需在布局中将
标记替换为如下内容:

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


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

我已经编辑了问题,请查看是否有帮助。从您现有的答案来看,您似乎正在向活动添加一个片段。但那部分对我来说很好。我需要在按下按钮时切换可见性。帮助您理解我正在尝试执行的操作。为什么要执行此操作?看起来有点奇怪。为什么不添加和删除
片段
?按钮只是一个触发器,以后可以用任何其他类型的触发器来概括它。在我看来,显示/隐藏片段是一个常见的场景。在添加/删除与显示/隐藏中,有什么权衡?