Android View.isShown() 在显示视图时返回 false

Android View.isShown() is returning false when the View is showing

我有一个名为 tvCallToActionBannerTextView,它根据某些事件显示。下面的这个方法控制是否显示 TextView。此方法在 Activity's onResume() 中被调用,其他几个方法也会调用它。

public void showCallToActionBanner() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (!mPrefs.getCurrentLiveGameDateId().isEmpty()) {
                mPrefs.setCallToActionType(GlobalVars.CTA_IN_GAME);
                tvCallToActionBanner.setText(R.string.cta_game_in_progress);
                if (!tvCallToActionBanner.isShown()) showCallToActionBanner(true);
            }
            else if (mPrefs.getLiveGameDateStatus().equals(GlobalVars.LIVE_GAME_DATE_SEARCHING)) {
                mPrefs.setCallToActionType(GlobalVars.CTA_LIVE_GAME_DATE_SEARCHING);
                tvCallToActionBanner.setText(R.string.cta_live_game_date_searching);
                if (!tvCallToActionBanner.isShown()) showCallToActionBanner(true);
            }
            else if (!mPrefs.getUnratedGameDateIds().isEmpty()) {
                mPrefs.setCallToActionType(GlobalVars.CTA_RATE_MATCH);
                mPrefs.setCallToActionId(mPrefs.getUnratedGameDateIds().iterator().next());
                tvCallToActionBanner.setText(R.string.cta_unrated_match);
                if (!tvCallToActionBanner.isShown()) showCallToActionBanner(true);
            }
            else if (tvCallToActionBanner.isShown()) {
                showCallToActionBanner(false);
            }
        }
    });
}

public void showCallToActionBanner(final boolean shouldShow) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (shouldShow) {
                Animation enterAnim = AnimationUtils.loadAnimation(MainActivity.this, R.anim
                        .banner_slide_down);
                enterAnim.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        int paddingTop = (int) getResources().getDimension(R.dimen
                                .main_container_top_spacing_for_banner);
                        mainContainer.setPadding(0, paddingTop, 0, 0);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }
                });

                tvCallToActionBanner.startAnimation(enterAnim);
                tvCallToActionBanner.setVisibility(View.VISIBLE);
            }
            else {
                Animation exitAnim = AnimationUtils.loadAnimation(MainActivity.this, R.anim
                        .banner_slide_up);
                exitAnim.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        mainContainer.setPadding(0, 0, 0, 0);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }
                });

                tvCallToActionBanner.startAnimation(exitAnim);
                tvCallToActionBanner.setVisibility(View.GONE);
            }
        }
    });
}

所以当我触发 tvCallToActionBanner 在 Activity A 中显示时,它显示没有问题。

我创建了 Activity B,onResume() 被调用并且显示没有问题。

然后我创建 Activity C,onResume() 被调用并显示 tvCallToActionBanner。我调用了一个现在隐藏 tvCallToActionBanner 的方法,它隐藏起来没有任何问题。

我按下后退按钮,它返回到 Activity B,它调用 onResume() 并且应该隐藏 tvCallToActionBanner 但它不是。

我检查了 tvCallToActionBanner.isShown(),在我从 C 按下后退按钮后,它在 Activity B 中 return 是错误的。但是视图显示得很清楚,应该是 returning true.

是不是Views的顺序画法的问题?我试图将方法调用移动到 onPostResume() 但那什么也没做。如何在显示时将 tvCallToActionBanner.isShown() 变为 return true?

只需使用View.getVisibility()方法。

if(textView.getVisibility == View.VISIBLE) {
    // do stuff
}   

isShown() 还检查其祖先的可见性 - 因此视图本身可能可见但其父项之一不可见 (@see here)

    textview.viewTreeObserver.addOnGlobalLayoutListener {
        Toast.makeText(this,"layout changed "
                +textview.isShown
            ,Toast.LENGTH_LONG)
            .show()

        Toast.makeText(this,"visible "+
                (textView.visibility==View.VISIBLE)
            ,Toast.LENGTH_LONG)
            .show()

    }