【问题标题】:Android View.isShown() is returning false when the View is showing显示视图时,Android View.isShown() 返回 false
【发布时间】:2015-05-25 06:03:26
【问题描述】:

我有一个名为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 在活动 A 中显示时,它显示没有问题。

我创建了活动 B,onResume() 被调用,它显示它没有问题。

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

我按下后退按钮,它返回到活动 B,它调用 onResume(),应该隐藏 tvCallToActionBanner,但事实并非如此。

我检查了tvCallToActionBanner.isShown(),在我按下 C 的后退按钮后,它在 Activity B 中返回 false。但视图清晰显示,应该返回 true

是不是因为Views的顺序绘制的方式?我试图将方法调用移至onPostResume(),但这没有任何作用。如何让 tvCallToActionBanner.isShown() 在显示时返回 true?

【问题讨论】:

  • 为什么不使用View.getVisibility 方法?
  • @Jakombo 这正在工作!请添加答案,以便我接受!我的意图是 View.isShown() 返回视图的 visibility 及其所有子视图...

标签: android view visibility


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
          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()
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-27
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多