【发布时间】:2015-05-25 06:03:26
【问题描述】:
我有一个名为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 在活动 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