Android View.isShown() 在显示视图时返回 false
Android View.isShown() is returning false when the View is showing
我有一个名为 tvCallToActionBanner
的 TextView
,它根据某些事件显示。下面的这个方法控制是否显示 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()
}
我有一个名为 tvCallToActionBanner
的 TextView
,它根据某些事件显示。下面的这个方法控制是否显示 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()
}