【问题标题】:Changing background in other activities with a button使用按钮更改其他活动的背景
【发布时间】:2016-10-13 21:59:59
【问题描述】:

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

【问题讨论】:

  • 设置活动中似乎不存在主页和详细信息视图。我想这会导致 nightBG 对象出现空引用异常。我认为您将不得不找到另一种方式来访问其他活动。目前不知道如何进行跨活动通信。
  • 我就是这么想的。问题是我是java编程的初学者。我希望我们能找到一些东西:P。不管怎么说,还是要谢谢你! :)
  • 我提交了一个我目前能做的最好的答案,它至少会给你另一个选择。

标签: java android android-activity android-togglebutton


【解决方案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);

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

【讨论】:

  • i.imgur.com/xZeiwKC.png 表示无法解析某些方法
  • 是的,我的错,如果您从活动中调用,则不必调用 getActivity()。我更改了我的示例代码以匹配此。但是,我不太确定为什么您在 getWindow() 上出现错误。您的 MainActvity 是 AppCompatActivity 的子类还是只是 Activity?但这只是改变背景颜色的一种方法,如果这种方法不适合您,那么还有很多其他方法可以做到。
  • 我在 android studio 中更新了代码,但仍然出现“.getWindow()”和“= getActivity”错误。嗯。无论如何,它说“公共类 MainActivity 扩展 AppCompatActivity”所以我猜它一个子类..它在所有 3 个活动中都相同..
  • 啊,是的,我忘记了在定义像 OnClickListeners 这样的代码块时,“this”不再是对活动的引用。我将“this”替换为“SettingsActivity.this”,试试看现在是否有效?
【解决方案2】:

在同一活动中更改当前活动的背景。由于 DetailsActivity 没有运行,你不能这样做,它会给你空指针。你想吃 3 个苹果,但你只有一个。当前活动启动后,更改背景。

更新:

您可以在当前活动中执行此操作,并且仅在当前活动中:

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

不要尝试在其他未运行的活动中调用它。

setBackground()

setBackgroundColor()

【讨论】:

  • 你能在这里发布一个带有代码的例子吗?我是 Java 编程的初学者。
  • 哦,好吧。但是如何更改其他活动的背景颜色。嗯..一定有办法!
  • 除非该活动正在运行,否则您不能这样做。您可以在活动布局中设置所需的颜色。就像试图改变你房间的颜色,但你没有房间。
【解决方案3】:

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

How to send string from one activity to another?

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

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

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

How do I get a variable in another activity?

这可能不是最好的处理方式,但应该可以。

【讨论】:

  • 好的,谢谢!!我会在 16 小时内试试这个(我现在要去睡觉了)!会告诉你这是否有效。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2021-11-26
    • 1970-01-01
    • 2018-04-29
    • 2016-10-09
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多