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

Chr*_*sov 4 android android-fragments android-support-library

我对Fragment.isVisible()应该如何工作感到困惑.即使我添加了一个片段Activity.create(),Fragment.isVisible()即使FragmentManager.commitNow()使用它也会返回false .

Fragment.isVisible()即使在中也返回false onResume().但是,单击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"));
}
Run Code Online (Sandbox Code Playgroud)

}

我最初认为也许是因为主线程还没有机会运行,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
Run Code Online (Sandbox Code Playgroud)

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

我使用支持库25.2并支持库片段,尽管本机片段产生相同的行为.

小智 5

片段有一种方法:

     getUserVisibleHint();
Run Code Online (Sandbox Code Playgroud)

您可以在官方文档中找到更多信息.

当片段对用户可见时它给出"true",当它不可见时给出"false".

请享用!


Mur*_*göz 0

你必须记住,Fragment 也有自己的生命周期。你基本上称其为时过早。如果满足以下条件,则片段被视为可见:

片段#isVisible

如果片段当前对用户可见,则返回 true。这意味着:(1) 已添加,(2)其视图已附加到窗口,并且 (3) 未隐藏。

请参阅这篇关于 Activity/Fragment 生命周期的 SO 帖子 在 Fragment 生命周期期间何时调用 onAttach?