当以编程方式完成时,视图不会反映任何变化
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;
【讨论】:
我同意我错过了一个参考,但非常明显的是,如果没有它,代码将无法编译,所以这不是答案。所以请不要用“可能”的拼写错误来弄乱答案区域。 更新了我的答案 感谢再次纠正我。我绝对不是说这是一个单一的动作,而是这里的又一次打字狂潮。您可以看到侦听器如何在每次单击时不断在true
和false
之间交替isTextBoxHidden
的值。我在帖子中更正了我的意图
嘿,循环正确切换需要该标志。如果标志 isTextBoxHidden=false 被移除,那么与所有未来的点击相比,if() 分支将永远不会被调用以上是关于当以编程方式完成时,视图不会反映任何变化的主要内容,如果未能解决你的问题,请参考以下文章