You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit onFailure回调中TextView设置可见性失效问题求助

解决Retrofit回调中TextView可见性设置无效的问题

首先咱们梳理下核心矛盾:你已经在onFailure回调里把tv_no_cat的可见性设为View.VISIBLE,Toast也证实getVisibility()返回的是VISIBLE,但界面上就是看不到它;可同样的操作对ContentLoadingProgressBar却完全生效。我来帮你拆解可能的原因和解决办法:

一、先确认回调是否在UI线程(保险起见)

Retrofit2的Callback默认是在主线程执行的,但如果你的项目自定义了回调线程池,就可能出现非UI线程操作UI的情况(虽然ProgressBar能正常工作让这个可能性降低,但还是可以验证下)。你可以手动强制在UI线程执行相关操作:

public void onFailure(Call<List<MoviesCategory>> call, Throwable t) {
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            videoLoadingPb.setVisibility(View.GONE);
            tv_no_cat.setVisibility(View.VISIBLE);
            tv_no_cat.setTextColor(Color.BLUE);
            Toast.makeText(getContext(), "Network Error "+(tv_no_cat.getVisibility() == View.VISIBLE), Toast.LENGTH_LONG).show();
        }
    });
}

或者用View的post方法更简洁:

tv_no_cat.post(new Runnable() {
    @Override
    public void run() {
        tv_no_cat.setVisibility(View.VISIBLE);
    }
});

二、检查视图层级与遮挡问题

从你的XML来看,tv_no_cat在loading_categories下方,但可能存在这些情况:

  • ProgressBar隐藏后,父布局尺寸变化导致TextView不在可见区域:比如父布局是RelativeLayout,当ProgressBar消失后,TextView的位置被挤出屏幕外。你可以给TextView临时加个红色背景(android:background="@color/red"),测试它是否真的没显示,还是只是文字看不见。
  • TextView的父布局本身不可见:检查包含这两个控件的父布局的visibility属性,确保它是VISIBLE状态。

三、强制刷新视图

有时候视图状态已经改变,但UI没有及时刷新,这时候可以调用方法强制更新:

tv_no_cat.setVisibility(View.VISIBLE);
tv_no_cat.invalidate(); // 刷新视图绘制
tv_no_cat.requestLayout(); // 触发重新布局

四、检查文字与背景的对比度

你设置了setTextColor(Color.BLUE),如果TextView的背景色(或父布局背景)也是蓝色,文字就会和背景融为一体,看起来像是没显示。可以临时把文字改成红色测试:

tv_no_cat.setTextColor(Color.RED);

五、排查是否有其他代码覆盖了设置

有没有可能在其他地方(比如onSuccess回调、生命周期方法、其他异步任务)又把tv_no_cat的可见性改回GONE了?你可以加断点或者Log,查看setVisibility方法的调用栈,确认没有其他代码覆盖你的操作。

按照上面的步骤逐一排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者E_K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:54:10