android - Fragment.isVisible() 返回 false,即使 Fragment 添加并可见

标签 android android-fragments android-support-library

我对 Fragment.isVisible() 应该如何工作感到困惑。即使我在 Activity.create() 中添加了 fragment ,Fragment.isVisible() 也会返回 false,即使 FragmentManager.commitNow() 是用过的。

Fragment.isVisible() 即使在 onResume() 中也返回 false。但是,单击 UI 按钮时返回的值是正确的。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public final static String TAG = "HideFragmentOnChange";

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

    ((Button)findViewById(R.id.my_button)).setOnClickListener(this);

    if(savedInstanceState == null){
        Fragment fragmentA = new FragmentA();

        Log.d(TAG, "onCreate: Before FragmentTransaction FragA: " + (fragmentA.isVisible() ? "visible" : "not visible"));

        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, fragmentA, "fragA")
                .commitNow();

        Log.d(TAG, "onCreate: After FragmentTransaction FragA: " + (fragmentA.isVisible() ? "visible" : "not visible"));

    }

    this.runOnUiThread(new Runnable(){
        @Override
        public void run() {
            Fragment fragA = getSupportFragmentManager().findFragmentByTag("fragA");
            Log.d(TAG, "runOnUiThread after onCreate(): FragA: " + (fragA.isVisible() ? "visible" : "not visible"));
        }
    });
}

@Override
protected void onResume() {
    super.onResume();

    Fragment fragA = getSupportFragmentManager().findFragmentByTag("fragA");
    Log.d(TAG, "onResume: FragA: " + (fragA.isVisible() ? "visible" : "not visible"));

    this.runOnUiThread(new Runnable(){
        @Override
        public void run() {
            Fragment fragA = getSupportFragmentManager().findFragmentByTag("fragA");
            Log.d(TAG, "runOnUiThread after onResume(): FragA: " + (fragA.isVisible() ? "visible" : "not visible"));
        }
    });
}

@Override
public void onClick(View v) {
    Fragment fragmentA = getSupportFragmentManager().findFragmentByTag("fragA");
    Log.d(TAG, "onClick(): FragA: " + (fragmentA.isVisible() ? "visible" : "not visible"));
}

我最初认为可能是因为主线程还没有机会运行,FragmentTransaction 直到稍后才完全正确地提交。但是,调用 runOnUiThread 不会更改 isVisible() 的返回值。

我附上日志以供引用。

03-15 17:22:34.978 14094-14094/ D/HideFragmentOnChange: onCreate: Before FragmentTransaction FragA: not visible
03-15 17:22:34.990 14094-14094/ D/HideFragmentOnChange: onCreate: After FragmentTransaction FragA: not visible
03-15 17:22:34.991 14094-14094/ D/HideFragmentOnChange: runOnUiThread after onCreate(): FragA: not visible
03-15 17:22:34.996 14094-14094/ D/HideFragmentOnChange: onResume: FragA: not visible
03-15 17:22:34.996 14094-14094/ D/HideFragmentOnChange: runOnUiThread after onResume(): FragA: not visible
03-15 17:22:56.683 14094-14094/ D/HideFragmentOnChange: onClick(): FragA: visible

为什么 Fragment.isVisible() 似乎以如此大的延迟返回正确的值?

我正在使用支持库 25.2 和支持库 fragment ,尽管 native fragment 产生了相同的行为。

最佳答案

有一个 fragment 的方法:

     getUserVisibleHint();

您可以在 official document 中找到更多信息.

当 fragment 对用户可见时给出“true”,当 fragment 不可见时给出“false”。

尽情享受吧!

关于android - Fragment.isVisible() 返回 false,即使 Fragment 添加并可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814459/

相关文章:

android - 如何在 fragment 转换中删除 fragment 被替换的 fragment ?

android - 如何使用 viewpager 从选项卡布局中的 recyclerview 重新加载 fragment ?

android - 多个 dex 文件定义 Landroid/support/v4/

java - 无法解决多个构建失败错误

唤醒屏幕时不显示 Android Activity 且锁定屏幕不禁用

android - Xamarin.Forms 滑动手势识别器

android - 如何控制捕获视频的帧高和宽度: setVideoSize() does not work

Android onLocationUpdate 未使用 GPS_PROVIDER 调用

android - 当父activity的状态必须保存时,你如何处理 fragment 事务?

android - 使用带有新工具栏的选项卡 (AppCompat v7-21)