每次我运行我的应用程序时崩溃都会给我一个nullpointerexception,我想根据场景以编程方式改变我的背景,这是我的代码:
主要活动:
public class Activity extends AppCompatActivity {
ConstraintLayout layout;
String messageSafe = "Item is Safe for Consumption";
String messageUnSafe = "Item is NOT Safe for Consumption";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_information);
layout = new ConstraintLayout(this);
if (matched.length == 0) {
layout.setBackgroundResource(R.drawable.background_safe);
setContentView(layout);
changeColor("#00FF00");
messageView.setText(messageSafe);
}
else{
layout.setBackgroundResource(R.drawable.background_unsafe);
setContentView(layout);
changeColor("#FF0000");
messageView.setText(messageUnSafe);
}
ListView listContains = (ListView) findViewById(R.id.lvItemsFound);
ArrayAdapter<String> contains = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, foundItems);
listContains.setAdapter(contains);
ListView listRestricted = (ListView) findViewById(R.id.lvItemsRestricted);
ArrayAdapter<String> found = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matched);
listRestricted.setAdapter(found);
}
答案 0 :(得分:1)
您丢失了对旧视图的引用,因为您将布局更改为新的ConstraintLayout
对象。这意味着您现在没有XML中的ListView
个对象和其他项目,因为该视图已消失。它不再是ContentView了。如果要处理现有布局,则需要为根视图提供ID。
<constraintlayout android:id="@+id/container" ... />
然后,您可以使用findViewById(R.id.container)
引用该ID,并使用您从中获取的对象来改变您的背景,就像您正在做的那样。
试试这个:
ConstraintLayout
设置一个ConstraintLayout layout = findViewById(R.id.container)
对象(注意:您可以将其称为任何内容,而不仅仅是容器,我只是从上面取消我的示例,因为我给了它ID&#39; container&#39 ;)
setBackgroundResource()
。
setContentView()
,这是在开头设置的,并且您不希望将其重置为刚刚构建的新视图,就像您最初所做的那样。
setAdapter()
时,您不应该崩溃,因为您没有引用内容视图中没有的对象。
ListView
答案 1 :(得分:1)
您正在尝试通过替换活动视图来设置背景(这是setContentView()
所做的)。这会导致以后出现空指针异常,因为旧的布局(在XML中定义)已被替换,因此列表视图不再存在。
相反,您应该获得对现有根视图(ConstraintLayout
)的引用,但如果您只是设置背景,则可以将其引用为{{1不需要如此具体),并在其上设置背景,如下所示:
View
您还需要在现有布局XML中为包含布局指定一个id:
findViewById(R.id.container).setBackgroundResource(R.drawable.unsafe);