Android Studio中如何通过用户输入修改layout资源的背景颜色?
实现方案
注意:APK编译打包后,res目录下的XML布局文件是只读属性,运行时无法直接修改XML内的配置。你可以直接修改已加载到内存中的布局实例的背景属性,视觉效果和修改XML配置完全一致。
核心修改点
- 移除你当前
AddColor按钮点击事件里的setContentView(R.layout.pickcolor)代码,该代码会重新加载布局,会清空用户已输入的内容,没有实际作用 - 校验用户输入的十六进制颜色代码合法性,避免格式错误导致崩溃
- 获取布局实例后直接调用
setBackgroundColor方法设置颜色
修改后的完整代码
package com.gade.tabletcolor; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; public class PickColor extends AppCompatActivity { View rootLayout; EditText addColor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pick_color); ImageButton button = findViewById(R.id.imageBtn11); Button AddColor = findViewById(R.id.colorBtn); addColor = findViewById(R.id.txtColor); // 获取当前Activity的内容根布局,也可以换成你自己布局根节点的id来findViewById rootLayout = findViewById(android.R.id.content); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { nextpage(); } }); AddColor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String colorStr = addColor.getText().toString().trim(); // 校验输入是否为空 if (colorStr.isEmpty()) { Toast.makeText(PickColor.this, "请输入十六进制颜色值", Toast.LENGTH_SHORT).show(); return; } // 兼容不带#的输入 if (!colorStr.startsWith("#")) { colorStr = "#" + colorStr; } // 校验颜色格式是否合法 try { int color = Color.parseColor(colorStr); rootLayout.setBackgroundColor(color); Toast.makeText(PickColor.this, "背景色修改成功", Toast.LENGTH_SHORT).show(); } catch (IllegalArgumentException e) { Toast.makeText(PickColor.this, "请输入合法的十六进制颜色值", Toast.LENGTH_SHORT).show(); } } }); } public void nextpage(){ Intent intent = new Intent(this,MainActivity.class); startActivity(intent); } }
持久化存储说明
如果需要下次打开App依然保留用户设置的背景色,可以把用户输入的合法颜色值存入SharedPreferences,在onCreate方法加载布局后读取存储的颜色值直接设置即可。
内容的提问来源于stack exchange,提问作者Peter Gade Carstensen
相关产品推荐
相关产品推荐

