我正在尝试动态更改按钮颜色,所以我创建了一个线程来执行此操作,但后续错误即将到来
W / System.err:java.lang.NullPointerException:尝试调用 虚方法'void android.widget.Button.setBackgroundColor(int)'on 空对象引用
以下是我的代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.hellotape.hdl.test_bomber.MainActivity">
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginStart="51dp"
android:layout_marginTop="127dp"
android:id="@+id/button"
android:visibility="visible" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button"
android:layout_alignParentEnd="true"
android:layout_marginEnd="52dp"
android:id="@+id/button2" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button"
android:layout_alignEnd="@+id/button"
android:layout_marginTop="113dp"
android:id="@+id/button3" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button3"
android:layout_alignEnd="@+id/button2"
android:id="@+id/button4"
android:elevation="5dp" />
</RelativeLayout>
}
{{1}}
调试时,我一进入线程t1就得到了,按钮变量b1,b2,b3,b4变为空,这个错误的原因是什么以及如何解决?
答案 0 :(得分:0)
您有2个MainActivity对象。首先,您的应用将启动onCreate()
,您的字段将被初始化。然后你调用new Thread(new MainActivity())
,这意味着你创建了一个MainActivity
的新对象。然后,您可以访问未初始化的主题按钮,因为如果您致电new MainActivity
,则onCreate()
将被调用。
答案 1 :(得分:0)
基本上,MainActivity在UI线程中运行,所有按钮都可以在UI线程中访问。由于我们开始了新的线程并且我们正在尝试修改按钮属性,因此无法访问按钮。如果我们要修改任何UI元素,我们必须使用 Handler或runOnUiThread 来执行此操作,如下所示
someActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
或
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
在run()中更新UI元素。