设置背景颜色时应用程序崩溃

时间:2018-02-22 16:30:30

标签: java android

每次我运行我的应用程序时崩溃都会给我一个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);


}

2 个答案:

答案 0 :(得分:1)

您丢失了对旧视图的引用,因为您将布局更改为新的ConstraintLayout对象。这意味着您现在没有XML中的ListView个对象和其他项目,因为该视图已消失。它不再是ContentView了。如果要处理现有布局,则需要为根视图提供ID。

<constraintlayout android:id="@+id/container" ... />

然后,您可以使用findViewById(R.id.container)引用该ID,并使用您从中获取的对象来改变您的背景,就像您正在做的那样。

试试这个:

  • 1。为您的根视图提供ID
  • 2。使用ConstraintLayout设置一个ConstraintLayout layout = findViewById(R.id.container)对象(注意:您可以将其称为任何内容,而不仅仅是容器,我只是从上面取消我的示例,因为我给了它ID&#39; container&#39 ;)
  • 3。像你一样打setBackgroundResource()
  • 4。无需再次调用setContentView(),这是在开头设置的,并且您不希望将其重置为刚刚构建的新视图,就像您最初所做的那样。
  • 5。尝试立即致电setAdapter()时,您不应该崩溃,因为您没有引用内容视图中没有的对象。

    ListView
  • 答案 1 :(得分:1)

    您正在尝试通过替换活动视图来设置背景(这是setContentView()所做的)。这会导致以后出现空指针异常,因为旧的布局(在XML中定义)已被替换,因此列表视图不再存在。

    相反,您应该获得对现有根视图(ConstraintLayout)的引用,但如果您只是设置背景,则可以将其引用为{{1不需要如此具体),并在其上设置背景,如下所示:

    View

    您还需要在现有布局XML中为包含布局指定一个id:

    findViewById(R.id.container).setBackgroundResource(R.drawable.unsafe);