根据从微调器中选择的颜色切换 android 应用程序的背景

Switching the background of an android app, based on a selected color form a spinner

我想问一下如何更改 android 应用程序的背景颜色/前提是我有一组颜色/下面我应用我尝试编写的代码来执行此操作任务:任务是根据当前从下拉列表(微调器)中选择的颜色更改应用程序的背景颜色。如果您能给我一些关于如何解决此问题的提示,我将不胜感激。

package com.example.assignment3_yoanivanov_322321010;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
    LinearLayout linearLayout;
    Spinner spinner;
    String[] items = {"red","green","blue","orange","yellow","gray"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //textView = (TextView) findViewById(R.id.txtMsg);
        spinner = (Spinner) findViewById(R.id.spinner2);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_dropdown_item, items);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String color  = parent.getItemAtPosition(position).toString();
        //Toast.makeText(parent.getContext(),color,Toast.LENGTH_LONG).show();
        switch(color){
            case "red":
                linearLayout.setBackgroundColor(Color.RED);
            case "green":
                linearLayout.setBackgroundColor(Color.GREEN);
            case "blue":
                linearLayout.setBackgroundColor(Color.BLUE);
            case "orange":
                linearLayout.setBackgroundColor(Color.rgb(255, 165, 0));
            case "yellow":
                linearLayout.setBackgroundColor(Color.YELLOW);
            case "GRAY":
                linearLayout.setBackgroundColor(Color.GRAY);
        }

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

你的问题可能是

LinearLayout linearLayout;

没有赋值(我在你的代码中没有看到)。

像使用微调器一样分配值

linearLayout = (LinearLayout) findViewById(R.id.**your_layout_id**);

然后就可以了

您有一些问题,我将在以下几点中提及:

1. 正如@Drogheda 所说你错过了 LinearLayout,但这不是主要问题。

注意:您可以省略多余的定义,例如Spinner = (Spinner) findViewById(R.id.spinner); 如果上面有一个变量 Spinner spinner;

因此: 删除 (Spinner) 或写入 Spinner spinner = findViewById(R.id.spinner);


2. 在您的 Switch 中,您在设置颜色后忘记设置 break;。它将 运行 不间断地遍历每种颜色,这就是为什么什么都没有改变的原因。


3. 如果要比较 String 名称,则需要 spinner.getSelectedItem() 而不是 parent.getItemAtPosition()。否则您需要提供 Integer 而不是 String.


看看我的代码。进行了一些小的改进,您可以从中学习如何做出更好的方法。

我提供从 MainActivity.java:

开始的完整代码
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner spinner = findViewById(R.id.mySpinner);
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, Arrays.asList("red", "green", "blue", "orange", "yellow", "gray"));
        spinner.setAdapter(arrayAdapter);
        LinearLayout linearLayout = findViewById(R.id.linear_layout);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String color = spinner.getSelectedItem().toString();
                switch (color) {
                    case "red":
                        linearLayout.setBackgroundColor(Color.RED);
                        break;
                    case "green":
                        linearLayout.setBackgroundColor(Color.GREEN);
                        break;
                    case "blue":
                        linearLayout.setBackgroundColor(Color.BLUE);
                        break;
                    case "orange":
                        linearLayout.setBackgroundColor(Color.rgb(255, 165, 0));
                        break;
                    case "yellow":
                        linearLayout.setBackgroundColor(Color.YELLOW);
                        break;
                    case "gray":
                        linearLayout.setBackgroundColor(Color.GRAY);
                        break;
                    default:
                        linearLayout.setBackgroundColor(Color.RED);
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }
}

还有它的布局 activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linear_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Your LinearLayout switch color through Spinner"
        android:textColor="@color/white"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/mySpinner"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_gravity="center" />

</LinearLayout>

结果: