我有问题。我有3个活动(MainActivity,DetailsActivity,SettingsActivity),在SettingsActivity中我有一个Togglebutton" Nightmode"。我想要的是,当按钮被更改时,改变灰色的所有三个活动的背景。
public class SettingsActivity extends AppCompatActivity {
//This is SettingsActivity(not Main one)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
TextView SettingsTitle = (TextView) findViewById(R.id.SettingsTitle);
TextView NightText = (TextView) findViewById(R.id.NightmodeText);
ToggleButton toggleNightMode = (ToggleButton) findViewById(R.id.toggleNightmode);
final RelativeLayout NightBG = (RelativeLayout) findViewById(R.id.NightBG);
final LinearLayout DetailsBG = (LinearLayout) findViewById(R.id.mainBG);
final LinearLayout HomeBG = (LinearLayout) findViewById(R.id.HomeBG);
toggleNightMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NightBG.setBackgroundColor(Color.parseColor("#545657"));
HomeBG.setBackgroundColor(Color.parseColor("#545657"));
DetailsBG.setBackgroundColor(Color.parseColor("#545657"));
}
});
NightBG与该java文件(SettingsActivity)的活动相同。但是HomeBG在MainActivity中,DetailsBG在DetailsActivity中。每次我启动应用程序,并按下该按钮,应用程序崩溃。如果我从此文件中删除HomeBG和DetailsBG,它可以正常工作,将当前布局的颜色更改为灰色。请帮帮我。
答案 0 :(得分:1)
在按钮单击时可能无法打开/激活的多个活动中存储这样的小设置的一种简单方法是使用SharedPreferences。
对于如此简单的代码,这可能有点过分,但如果您没有找到其他任何内容,您可以随时尝试。
您的代码可能如下所示:
toggleNightMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Set the color of this activity
int color = Color.parseColor("#545657")
View view = SettingsActivity.this.getWindow().getDecorView();
view.setBackgroundColor(color);
// Save color preference
SharedPreferences sharedPref = SettingsActivity.this.getSharedPreferences("bgColorFile",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("color", color);
editor.apply();
}
});
然后当你打开你的活动时,你可以在你的活动的onStart()或onCreate()方法中放置这样的东西:
// Get the color preference
SharedPreferences sharedPref = getSharedPreferences("bgColorFile",Context.MODE_PRIVATE);
int colorValue = sharedPref.getInt("color", 0);
View view = this.getWindow().getDecorView();
view.setBackgroundColor(colorValue);
所以你实际做的是将背景颜色存储为持久数据,并在重新打开/打开要打开颜色的活动时获取它。这种方法的好处是,无论何时关闭应用程序,都会记住首选的背景颜色。我希望这会有所帮助。
答案 1 :(得分:0)
更改同一活动中当前活动的背景。由于DetailsActivity没有运行,你不能这样做,它会给你空指针。你有点尝试吃3个苹果而你只有一个。当前活动开始后,更改背景。
更新
您可以在当前活动和当前活动中执行此操作:
findViewById(android.R.id.content).setBackground(getColor(R.color.your_color));
请勿尝试在未运行的其他活动中调用此方法。
setBackground()
或
setBackgroundColor()
答案 2 :(得分:0)
如果您的其他活动已打开,则应使用Intent向其他活动发送消息。
How to send string from one activity to another?
当您收到意图时,您可以设置活动的背景。
如果您的其他活动尚未开放,您将无法向他们发送意图。在这种情况下,您可以让每个Activity引用在主活动中包含可包含当前背景颜色的静态值。您可能希望在创建函数的其他活动上引用该值。
以下是有关如何从其他活动引用变量的示例。
How do I get a variable in another activity?
这可能不是处理它的最好方法,但它应该有用。
答案 3 :(得分:0)
如Ay Rue所说,你有两个选择:对该按钮使用静态变量,然后在每个活动的onResume中,检查静态变量的值(true或false)。或者您可以保存私有变量nightMode,然后在需要移动到其他两个活动时在intent中传递此值。 如果您之前已设置并具有更新的背景颜色,请不要设置背景颜色。