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

Java 应用程序在设置背景颜色时崩溃,java,android,Java,Android,每次我运行我的应用程序时,它都会崩溃,给我一个nullpointerexception,我想根据场景以编程方式更改我的背景,以下是我的代码: 主要活动: public class Activity extends AppCompatActivity { ConstraintLayout layout; String messageSafe = "Item is Safe for Consumption"; String messageUnSafe = "Item is NOT Safe f

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


}
公共类活动扩展了AppCompatActivity{
约束布局;
String messageSafe=“商品可以安全消费”;
String messagesafesafe=“商品不安全消费”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_信息);
布局=新约束布局(此);
if(matched.length==0){
布局.背景资源(R.可绘制.背景安全);
setContentView(布局);
变色(“00FF00”);
messageView.setText(messageSafe);
}
否则{
布局。设置背景资源(R.可绘制。背景不安全);
setContentView(布局);
变色(“FF0000”);
messageView.setText(messageUnSafe);
}
ListView listContains=(ListView)findViewById(R.id.lvItemsFound);
ArrayAdapter contains=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,foundItems);
setAdapter(包含);
ListView listRestricted=(ListView)findViewById(R.id.lvItemsRestricted);
ArrayAdapter found=新的ArrayAdapter(这个,android.R.layout.simple\u list\u item\u 1,匹配);
listRestricted.setAdapter(已找到);
}

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

然后,您可以使用
findviewbyd(R.ID.container)
引用该ID,并使用从中获得的对象像您正在做的那样更改背景

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

    layout = (ConstraintLayout)findViewById(R.id.container);
    if (matched.length == 0) {
        layout.setBackgroundResource(R.drawable.background_safe);
        changeColor("#00FF00"); //assuming this is some local function?
        messageView.setText(messageSafe);
    }
    else{
        layout.setBackgroundResource(R.drawable.background_unsafe);
        changeColor("#FF0000");
        messageView.setText(messageUnSafe);
    }
    

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

    然后,您可以使用
    findviewbyd(R.ID.container)
    引用该ID,并使用从中获得的对象像您正在做的那样更改背景

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

    layout = (ConstraintLayout)findViewById(R.id.container);
    if (matched.length == 0) {
        layout.setBackgroundResource(R.drawable.background_safe);
        changeColor("#00FF00"); //assuming this is some local function?
        messageView.setText(messageSafe);
    }
    else{
        layout.setBackgroundResource(R.drawable.background_unsafe);
        changeColor("#FF0000");
        messageView.setText(messageUnSafe);
    }
    

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

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

    findViewById(R.id.container).setBackgroundResource(R.drawable.unsafe);
    
    您还需要在现有布局XML中为包含布局指定一个id:

    <android.support.constraint.ConstraintLayout
        android:id="@+id/container"
        ... etc.
    

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

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

    findViewById(R.id.container).setBackgroundResource(R.drawable.unsafe);
    
    您还需要在现有布局XML中为包含布局指定一个id:

    <android.support.constraint.ConstraintLayout
        android:id="@+id/container"
        ... etc.
    

    您的
    ListView
    null
    (在活动中定义的任何位置)。发布完整的xml文件和java类您对
    ListView
    有一个
    null
    引用,并且正在尝试调用
    setAdapter()
    在某个点上对对象执行操作。您需要首先初始化对象来解决此问题。您的
    列表视图
    null
    (无论在活动中定义在哪里)。发布完整的xml文件和java类您对
    列表视图
    有一个
    null
    引用,并且正在尝试调用
    setAdapter()
    在某个点上对对象执行操作。您需要先初始化对象来解决此问题。这是有效的