java - fragment.isVisible() 总是返回 false

标签 java android android-fragments

我正在尝试设置一个覆盖 fragment ,该 fragment 会在触摸按钮时出现并在再次单击按钮时消失。我没有使用支持库 fragment ,而是使用常规 fragment 。因此,当您单击按钮附加 fragment 时,它会执行此操作,代码如下:

boolean hasNativeFrag = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.native_chat) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        NativeFragment nativeFragment = new NativeFragment();

        //Add/remove fragment
        if (!hasNativeFrag) {
            getFragmentManager().executePendingTransactions();
            fragmentTransaction.add(R.id.FragmentContainer, nativeFragment);

            hasNativeFrag = true;
        }

        if(nativeFragment.isVisible()){
            fragmentTransaction.hide(nativeFragment);
        }
        else {
            fragmentTransaction.show(nativeFragment);
        }
        fragmentTransaction.commit();

    }

    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

但是当我再次单击该按钮时,我希望 if 条件运行,因为它现在可见,并且应该隐藏它。然而 nativeFragment.isVisible() 总是返回 false。我做错了什么?

非常感谢

更新 1: 无法让它与答案提出的任何方法一起使用,但一个简单的 boolean 值至少可以像这样在它们之间切换:

boolean hasNativeFrag = false;
boolean isNativeFragShown = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();


    if (id == R.id.native_chat) {
        Log.v("NativeChat", "NativeChat");

        //Instantiate fragment
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        NativeFragment nativeFragment = new NativeFragment();


        //Show/Hide

        if (isNativeFragShown) {
            fragmentTransaction.hide(nativeFragment);
            Log.d("Hidden", "Hidden");
            isNativeFragShown = false;

        } else {
            fragmentTransaction.show(nativeFragment);
            Log.d("Shown", "Shown");
            isNativeFragShown = true;
        }

        //Add/remove fragment
        if (!hasNativeFrag) {
            getFragmentManager().executePendingTransactions();
            fragmentTransaction.add(R.id.FragmentContainer, nativeFragment);
            isNativeFragShown = true;
            hasNativeFrag = true;
        }
        fragmentTransaction.commit();

    } else if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

日志说它在函数之间切换,这很好,但是 fragment 仍然可见,即使在使用 .hide 之后也是如此

我是不是引用了错误的东西?

最佳答案

您可以使用以下方法 getUserVisibleHint() 来确定您的 fragment 是否对用户可见

关于java - fragment.isVisible() 总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36771179/

相关文章:

android - Android 6.0设置闹钟的精确方法

java - 是否可以使用 view inflator 给单个元素充气?

java - Fragment中TextView的空对象引用

java - Spring Boot 2.0.0 循环 bean 依赖 EntityManger 和 SessionFactory

java - Java 接口(interface)类型转换

java - 派生类中的实例变量与父类(super class)的私有(private)实例变量同名吗?

android - Android FFmpeg 和 SOX 的二进制文件

android - fragment 布局加载延迟

android - 在Android中将ExpandableListView的指示器放在右侧

java - 为什么图书馆要使用注释?