1

我有个问题。我有 3 个活动(MainActivity、DetailsActivity、SettingsActivity),在 SettingsActivity 中有一个切换按钮“夜间模式”。我想要的是,当按钮更改时,将所有三个活动的背景更改为灰色。

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,它可以很好地将当前布局的颜色更改为灰色。请帮我。

4

4 回答 4

2

在单击按钮时可能未打开/活动的多个活动中存储此类小设置的一种简单方法是使用 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);

因此,您实际上正在做的是将背景颜色存储为持久数据,并在您重新打开/打开要设置颜色的活动时获取它。这种方法的好处是,每当您关闭应用程序时,都会记住首选的背景颜色。我希望这有帮助。

于 2016-10-13T22:43:34.627 回答
0

正如 Ay Rue 所说,您有 2 个选项:为该按钮使用静态变量,然后在每个活动的 onResume 中检查静态变量的值(真或假)。或者您可以保存一个私有变量 nightMode,然后在您需要移动到其他两个活动时在意图中传递此值。如果您之前已经设置并且具有更新的背景颜色,请不要设置背景颜色。

于 2016-10-13T22:47:34.843 回答
0

如果您的其他活动是开放的,您应该使用 Intent 向其他活动发送消息。

如何将字符串从一项活动发送到另一项活动?

当您收到 Intent 时,您可以设置活动的背景。

如果您的其他活动尚未开放,您将无法向他们发送 Intent。在这种情况下,您可以让每个 Activity 在您的主 Activity 中引用一个静态值,该值可能包含当前背景颜色。您可能希望在创建函数的其他活动中引用该值。

这是一个关于如何从另一个活动中引用变量的示例。

如何在另一个活动中获取变量?

这可能不是处理它的最漂亮的方法,但它应该可以工作。

于 2016-10-13T22:17:34.180 回答
0

Change background for current activity in the same activity. Since DetailsActivity is not running, you can't do that, it gives you null pointer. Is kind of you are trying to eat 3 apples and you have just one. After current activity is started, change background.

Update:

You can do that in current activity and just in current activity:

findViewById(android.R.id.content).setBackground(getColor(R.color.your_color));

Don't try to call this in other activities that are not running.

setBackground()

or

setBackgroundColor()
于 2016-10-13T22:05:27.363 回答