设置 LinearLayout setVisibility 无效很奇怪

本博客展示了如何通过点击图片实现隐藏图片并显示详细解释与英文例句的交互功能,提供了完整的代码实现和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

============问题描述============


<FrameLayout
        android:id="@+id/FrameLayout_ms"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <ImageView
            android:id="@+id/imageView_logio_a"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="showDanCiMessage"
            android:src="@drawable/logo_gray" />

        <LinearLayout
            android:id="@+id/LinearLayout_jieShi_lay"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" android:visibility="gone"  >

            <TextView
                android:id="@+id/textView_zwsy"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="中文"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/line_qianHui"
               />

            <TextView
                android:id="@+id/textView_lj_en"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="英文例句"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/line_qianHui"
               />

            <TextView
                android:id="@+id/textView_lj_cn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="中文解释"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/selectTextColor"
                />
        </LinearLayout>
    </FrameLayout>


需要实现的功能是点击上面的那个图片,然后图片隐藏,把LinearLayout 这个布局里的东西全部显示出来
public void showDanCiMessage(View v1) {

ImageView iv = (ImageView) v1.findViewById(R.id.imageView_logio_a);
iv.setVisibility(View.GONE);//图片可以隐藏

View v = LayoutInflater.from(this).inflate(R.layout.layout_fuxidanci,
null);
LinearLayout lLay = (LinearLayout) v
.findViewById(R.id.LinearLayout_jieShi_lay);
lLay.setVisibility(View.INVISIBLE);//这里显示不出来,但是也不出错
各位看看

============解决方案1============


lLay.setVisibility(View.INVISIBLE);//View.VISIBLE吧
另外你怎么不直接LinearLayout lLay = (LinearLayout) v1.findViewById(R.id.LinearLayout_jieShi_lay);

============解决方案2============


lLay定义成全局的。
在onCreate里获取lLay = (LinearLayout) findViewById(R.id.LinearLayout_jieShi_lay);
然后在showDanCiMessage设置隐藏。

转载于:https://www.cnblogs.com/llj1985522/p/4046080.html

<think>我们正在解决AndroidsetVisibility方法无效的问题。根据引用[1],当View在xml中设置为GONE时,在代码中第一次设置为VISIBLE后立即执行动画可能会失效,因为View尚未完成渲染。解决方法是:在xml中将初始状态设置为INVISIBLE而不是GONE,这样View会被渲染(只是不可见),然后设置VISIBLE时动画就能立即生效。此外,我们还需要考虑其他可能导致setVisibility无效的原因,例如:1.视图未正确布局(如尺寸为0)2.视图被其他视图覆盖3.代码逻辑错误(如条件判断导致又设置回去了)4.视图不在当前显示的布局中(如Fragment未正确添加)根据用户的问题描述,我们主要关注第一次设置VISIBLE时动画无效的情况,因此重点参考引用[1]的解决方案。解决方案步骤:1.在xml布局文件中,将View的初始可见性设置为`android:visibility="invisible"`(而不是gone)。2.在代码中,当需要显示View时,使用`view.setVisibility(View.VISIBLE)`,然后执行动画。如果用户的问题不是关于动画,而是setVisibility本身没有改变可见性,那么我们需要检查其他原因。例如:-确保操作在主线程-检查是否有多处设置可见性的代码相互覆盖-检查视图是否被父视图覆盖(如RelativeLayout中位置重叠,但引用[2]提到点击事件不工作,可能由于视图被覆盖或未设置clickable)但根据用户问题,我们聚焦于setVisibility无效,尤其是与动画结合时的问题。因此,针对动画失效的情况,采用将初始状态设置为INVISIBLE的方案。如果用户的问题不是动画失效,而是视图根本不显示,则需进一步检查布局和代码逻辑。下面我们将按照用户要求,提供清晰的结构化回答。</think>### Android 中 `setVisibility` 无效的解决方案 #### 问题原因分析 1. **GONE 状态的渲染延迟** 当 View 在 XML 中初始化为 `GONE` 时,系统不会立即渲染其布局。首次调用 `setVisibility(View.VISIBLE)` 后,若立即执行动画,系统需先完成渲染(约 1 帧时间),导致动画失效,第二次生效[^1]。 *示例代码:* ```xml <Button android:visibility="gone" /> <!-- 问题根源 --> ``` 2. **视图层级覆盖** 在 `RelativeLayout` 等容器中,视图可能被其他组件覆盖(即使不可见),导致事件无法触发[^2]。 3. **异步渲染未完成** 若在 `onCreate()` 中过早调用 `setVisibility()`,视图可能未完成测量/布局流程。 --- #### 解决方案 ##### 1. 针对动画失效问题(首次无效) **修改 XML 初始状态**: 将 `gone` 改为 `invisible`,确保系统预渲染视图: ```xml <Button android:visibility="invisible" <!-- 关键修改 --> android:id="@+id/btn_anim" /> ``` **代码中显示并开启动画**: ```java btn_anim.setVisibility(View.VISIBLE); btn_anim.startAnimation(animation); // 此时动画立即生效 ``` ##### 2. 通用排查步骤 - **检查线程**:确保在主线程更新 UI - **验证父容器**:确认父布局未覆盖目标视图(参考[^2]) - **延迟执行**:若需在 `onCreate()` 中操作,通过 `post()` 延迟: ```java view.post(() -> { view.setVisibility(View.VISIBLE); view.startAnimation(animation); }); ``` - **强制重绘**:调用 `requestLayout()` 刷新视图 ```java view.setVisibility(View.VISIBLE); view.requestLayout(); // 触发重绘 ``` ##### 3. 特殊场景处理 **动态添加的视图**: 若通过代码 `addView()` 添加,需在 `onAttachedToWindow()` 回调后再操作可见性。 **Fragment 中的视图**: 在 `onViewCreated()` 中操作,而非 `onCreateView()`: ```java @Override public void onViewCreated(View view, Bundle savedInstanceState) { getView().findViewById(R.id.target).setVisibility(View.VISIBLE); } ``` --- #### 技术原理 - **GONE vs INVISIBLE**: `INVISIBLE` 会参与布局计算并预渲染,而 `GONE` 完全移出布局流(首次显示需重新构建渲染树)[^1]。 - **动画失效本质**: 对未渲染的视图执行动画,系统会跳过首帧渲染(动画执行完成才显示视图)。 > **避坑提示**:涉及动画时,优先用 `INVISIBLE` 替代 `GONE`;若必须用 `GONE`,显示后延迟 16ms(1 帧时间)再启动画。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值