当以编程方式完成时,视图不会反映任何变化

Posted

技术标签:

【中文标题】当以编程方式完成时,视图不会反映任何变化【英文标题】:Views are not reflecting any changes whatsoever, when done programmatically 【发布时间】:2020-02-19 03:39:57 【问题描述】: 基本的视图层次结构是这样的: 第二个活动 线性布局(线性布局) 常量布局(约束布局) 文本框(文本视图) 图像(图像视图) 图2 图3 ...

文本框 TextView 的可见性已消失,目标是在单击其他可见同级时使其可见,更改一些颜色和文本,再次单击时它必须再次不可见并反转所有更改。 无法理解缺少的是什么。我检查了许多旧项目,在这些项目中我做了同样的事情,但找不到任何明显的差异来说明为什么这段代码现在不起作用。

secondActivity.java

public class secondActivity extends Activity 

    public boolean isTextBoxHidden;
    public ConstraintLayout constLayout;
    public TextView textbox;

    @Override protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        constLayout = findViewById(R.id.constLayout);
        textbox = findViewById(R.id.textbox);
        isTextBoxHidden = false;

        // SETTING UP LISTENER
        View.OnClickListener clickListener = new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                if(!isTextBoxHidden) 
                    constLayout.setBackgroundColor(Color.BLACK);  //setting color on previously 
                    v.setBackgroundColor(Color.BLACK);            //setting color on visible view

                    textbox.setText("whatever");
                    textbox.setVisibility(View.VISIBLE);  //was gone
                    isTextBoxHidden = true;
                
                else 
                    textbox.setVisibility(View.GONE);     //hide again
                    constLayout.setBackgroundColor(Color.WHITE);
                    v.setBackgroundColor(Color.WHITE);
                    isTextBoxHidden = false;
                
            
        ;

        // INSERTING LISTENERS into all children
        for(int i=0; i<constLayout.getChildCount(); i++) 
                constLayout.getChildAt(i).setOnClickListener(clickListener);
        
    

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".secondActivity">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/constLayout"
        android:layout_
        android:layout_
        android:background="@android:color/white">

        <TextView
            android:id="@+id/textbox"
            android:layout_
            android:layout_
            android:gravity="center"
            android:text="example"

            android:visibility="gone"

            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

        <ImageButton
            android:id="@+id/image"
            android:layout_
            android:layout_
            android:adjustViewBounds="true"
            android:scaleType="fitXY"
            android:src="@drawable/example"

            android:clickable="true"

            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"/>

        <!--few more clones of the first imageButton-->

    </android.support.constraint.ConstraintLayout>
</LinearLayout>

【问题讨论】:

【参考方案1】:

我看不到你在哪里设置 textbox 引用,所以也许这是一个线索。

编辑: 是否编译了您提供的示例并且一切正常,但我认为[...] gone again for good 意味着您可能希望这是一次拍摄动作,所以不要使用boolean,只需使用Boolean 并将其与null 进行比较。

编辑: 第二个想法,您可以在 else 分支中删除 isTextBoxHidden = false;

【讨论】:

我同意我错过了一个参考,但非常明显的是,如果没有它,代码将无法编译,所以这不是答案。所以请不要用“可能”的拼写错误来弄乱答案区域。 更新了我的答案 感谢再次纠正我。我绝对不是说这是一个单一的动作,而是这里的又一次打字狂潮。您可以看到侦听器如何在每次单击时不断在truefalse 之间交替isTextBoxHidden 的值。我在帖子中更正了我的意图 嘿,循环正确切换需要该标志。如果标志 isTextBoxHidden=false 被移除,那么与所有未来的点击相比,if() 分支将永远不会被调用

以上是关于当以编程方式完成时,视图不会反映任何变化的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView:从xib加载视图和更新subView的高度约束没有反映任何变化?

当以编程方式设置根视图控制器时,导航和标签栏丢失

需要重启 Puma 以反映视图的变化?

检查 NSManagedObject 的对象图的变化

为啥自定义指令不能立即反映其代码的变化

视图控制器完成加载时 UIView 背景颜色发生变化