- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
第一次在这里学习编码语言..我在 Java 的很多地方都在挣扎,但我正在慢慢学习。
我正在制作一个应用程序,必须显示动态更新的文本。所以下面的代码是我的尝试,它工作得很好(有点)。问题是当程序运行 for 循环时它不会更新屏幕。
因此,当我从主要 Activity 中按下按钮时,它会运行一个名为播放的 Activity 。它有 14 个 0 的文本字段,应该自动将它们一一更新为 7。
但是运行下面的代码后,片刻之后只显示了十四个7。 (也没有 0 开头!)显示屏幕的任何代码,以便我可以将其放在 setText() 下?
如果之前有人问过这个问题,我很抱歉,但我真的无法在网上找到任何答案。
public class Play extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_play);
Initialization();
}
public void Initialization() {
TextView[] textViews = new TextView[] {
(TextView)findViewById(R.id.player1_1),
(TextView)findViewById(R.id.player1_2),
(TextView)findViewById(R.id.player1_3),
(TextView)findViewById(R.id.player1_4),
(TextView)findViewById(R.id.player1_5),
(TextView)findViewById(R.id.player1_6),
(TextView)findViewById(R.id.player1_7),
(TextView)findViewById(R.id.player2_1),
(TextView)findViewById(R.id.player2_2),
(TextView)findViewById(R.id.player2_3),
(TextView)findViewById(R.id.player2_4),
(TextView)findViewById(R.id.player2_5),
(TextView)findViewById(R.id.player2_6),
(TextView)findViewById(R.id.player2_7)
};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 14; j++) {
textViews[j].setText(Integer.toString(i));
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
最佳答案
目前,您在 UI 线程上调用 Thread.sleep(25)
。这意味着 UI 线程将被阻塞并且不会更新您的 TextView 。在所有阻塞之后,它最终在 for 循环后解除阻塞,因此您可以立即看到所有文本字段都在更新。
为了更好的用户体验,永远不要让 UI 线程 hibernate 。
您需要能够在一段时间后完成一些工作的东西。 android.os.Handler
是一个不错的选择。它有一个 postDelayed
方法,可以在一段时间后执行您希望它执行的操作。
IMO,直接调用 postDelayed
确实可以完成您的工作。但是每个 postDelayed
调用都包含另一个调用,以便在几秒后更新下一个 TextView 。这意味着您最终会得到 14 层嵌套!这不是很干净的代码,是吗?
那么,让我介绍一下Timer
类吧!
这里是:
import android.os.Handler;
public class Timer {
private Handler handler;
private boolean paused;
private int interval;
private Runnable task = new Runnable () {
@Override
public void run() {
if (!paused) {
runnable.run ();
Timer.this.handler.postDelayed (this, interval);
}
}
};
private Runnable runnable;
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public void startTimer () {
paused = false;
handler.postDelayed (task, interval);
}
public void stopTimer () {
paused = true;
}
public Timer (Runnable runnable, int interval, boolean started) {
handler = new Handler ();
this.runnable = runnable;
this.interval = interval;
if (started)
startTimer ();
}
}
这东西很酷。
为了满足要求,让我们在您的 Activity 类中添加一个计数器
和textViewToUpdate
,以便我们知道它是什么数字以及接下来要更新哪个 TextView 。哦,将 textViews
变量移动到类级别:
int counter = 1;
int textViewToUpdate = 0;
TextView[] textViews;
并在onCreate
中初始化textViews
:
textViews = new TextView[] {
(TextView)findViewById(R.id.player1_1),
(TextView)findViewById(R.id.player1_2),
(TextView)findViewById(R.id.player1_3),
(TextView)findViewById(R.id.player1_4),
(TextView)findViewById(R.id.player1_5),
(TextView)findViewById(R.id.player1_6),
(TextView)findViewById(R.id.player1_7),
(TextView)findViewById(R.id.player2_1),
(TextView)findViewById(R.id.player2_2),
(TextView)findViewById(R.id.player2_3),
(TextView)findViewById(R.id.player2_4),
(TextView)findViewById(R.id.player2_5),
(TextView)findViewById(R.id.player2_6),
(TextView)findViewById(R.id.player2_7)
};
首先在你的类中创建一个计时器:
Timer t;
在您的Initialization
方法中,创建一个runnable。这个 runnable 将每隔几秒运行一次。
Runnable r = new Runnable () {
@Override
public void run() {
PlayActivity self = PlayActivity.this;
self.textViews[self.textViewToUpdate].setText(Integer.toString(self.counter));
self.textViewToUpdate++;
if (self.textViewToUpdate == self.textViews.length) {
self.textViewToUpdate = 0;
self.counter++;
if (self.counter == 8) {
self.t.stopTimer();
}
}
}
}
然后,我们创建计时器并运行它:
t = new Timer(r, interval, true);
您可以将 interval
替换为您喜欢的任何数字,例如 250
(0.25 秒)?
砰!你做到了!
关于java - Android studio Java 循环更新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37357686/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!