在单独的线程中通过Handler更新Android TextView

3

我目前正在为大学制作我的第一个安卓应用程序。虽然我慢慢接近成功,但我卡在某个地方了。

课程作业要求使用与UI线程不同的单独线程。我的想法是用户可以在Name_edit.java中设置他们的名称,然后当他们转到board.java(另一个活动)时,两个文本视图现在显示输入的内容。

在Name_edit.xml中,我有两个编辑文本。

在board.java中,我有两个文本视图(当前分别设置为P1和P2)。在OnCreate()中,我目前正在编写一个处理程序,以从(name_edit)两个编辑文本中获取两个值,并将其设置为文本视图。我认为这将需要两个处理程序(每个值一个)。在board.java中,我已经完成了标准的findViewById。

关于处理程序和线程的任何帮助都将是有用的。

我会发布我的处理程序代码,但它目前不断变化。我正在努力的是

handler = new Handler() {
    public void handleMessage (Message msg) {
        TextViewP1.setText(msg)
    }
};

注意:msg当前未设置为来自name_edit的edittext。

1个回答

1
你尝试过runOnUiThread()吗?UI元素只能从UI线程更改,而你在这里的处理程序运行在它自己的线程上。
handler = new Handler() {
    public void handleMessage (Message msg) {
        ((Activity)context).runOnUiThread(new Runnable() {
            public void run() {
               TextViewP1.setText(msg);
            }
        });
    }
}

如果您的处理程序在Activity类中,则可以使用[class name].this替换context

文档:http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)


我已经添加了你所说的内容。为了上下文,我用Board.this替换了它。这个活动是TextViews所在的地方(从editText中获取的名称将显示在这里)。我在TextViewP1.setText(msg)处遇到了一个错误:“此行有多个标记 -无法引用不同方法中定义的内部类中的非最终变量msg -TextView中的setText(CharSequence)方法不适用于参数”。 NameEdit.java中是否应该存在一些代码(这是用户将在其中输入editText中的名称的活动)@shanet - Dan1676
@Dan1676 你尝试过将 TextViewP1 声明为 final 吗?或者你可以将它声明为全局变量。 - shanet
@Dan1676 让我们从更大的角度来看待这个问题。为了避免混淆,告诉我这样理解是否正确:Name_edit.java 是用户输入姓名的一个活动。当用户完成输入后,Board.java 是另一个活动,用于显示这些姓名,对吗?如果是这样,Board 活动会启动 Name_edit 活动吗?如果是这样,我认为最好使用 startActivityForResult() 并将姓名作为数组或 bundle 发送回 Board 活动,而不是使用 handlers。这样说通了吗? - shanet
@Dan1676 我不确定你所说的直接链接和间接链接是什么意思,但你可以通过intent.putExtra()使用Intent传递自定义数据。否则,根据你从哪里调用startActivity()来启动Name_edit活动,你可以将该调用更改为startActivityForResult(),然后在你的Board活动中重写onActivityResult()以使用setResult()设置作为Name_edit活动结果设置的玩家名称。在Android文档中查找这些函数以获取更多信息。 - shanet
好的。感谢你今天的帮助。明天会尝试你说的方法,我已经编码了9个小时,所以现在就到这里吧。再次感谢你的帮助。 - Dan1676
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接