android - fragment 显示/隐藏根本不起作用

标签 android android-fragments

为了理解 fragment 背后的基本概念,我一直在尝试构建一个 Android 应用程序。但我完全无法显示和隐藏 fragment 。
这是我的 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 在我的例子中只是一个文本行。该按钮应该做的是切换 fragment 的可见性。 谁能告诉我这段代码有什么问题吗?
不工作,我的意思是该按钮在点击时什么都不做,除了将其文本从“隐藏”更改为“显示”,然后无论您点击多少次,它都会保持“显示”。而这个过程对 fragment 的行为完全没有影响。

最佳答案

我真的不明白你想在这里做什么,但你从来没有提交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 的容器你想添加。您可以使用 FragmentTransaction在上面添加 Fragment对此FrameLayout .

关于android - fragment 显示/隐藏根本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24881715/

相关文章:

android - android 数据绑定(bind)无法正常工作

android - 返回 ViewPager,我的 GoogleMap fragment 不可见

android - 具有动态高度的 Viewpager 不起作用(始终使用第一个 fragment 的高度)

android - 我想在 android 中将音频服务器 (/frameworks/av/media/audioserver) 构建为 64 位,但它无法启动

android - 基于 Air Android Flash Professional CS6 的应用程序中的退出按钮

android - 两个 NFC 标签分别链接到项目中的两个不同 Activity ?

java - Android:蓝牙监听线程正在阻塞 UI 线程

android - fragment 或父 Activity 中的异步任务?

android - 在 Android 的 fragment 中调用函数

android - 根据当前 fragment 处理 fragment 回栈