.setText(" text ") 在 android studio 中无法正常工作

问题描述

我是 android 开发的新手 我想创建一个将亮模式转换为暗模式的应用程序 我有一个名为启用暗模式的按钮 我想在按下该按钮时启用暗模式,我打开了暗模式,但是我还想更改按钮中的文本以在单击按钮后启用灯光模式。当我使用 setText() 方法更改 onclick 方法中的文本时 框中的文本仅在我按下按钮 2 次时才会更改,但我希望第一次按下按钮后文本立即更改 这是我的java代码

public class MainActivity extends AppCompatActivity {

    private Button darkmode;

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

        darkmode = (Button) findViewById(R.id.darkmodebutton);

        darkmode.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                darkmode.setText("enable light mode");
            }
        });
    }
}

谁能帮帮我,拜托 这是应用程序的行为方式,我制作了一个 gif

app behaviour

解决方法

我认为应用程序生命周期会在主题更改时重置。您可以使用生命周期感知状态变量来跟踪主题状态。

您可以阅读更多相关信息here

Boolean isLightThemeEnabled = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        theme = savedInstanceState.getString("THEME_KEY");
    }

    // YOUR USUAL CODE
    // MAKE SURE TO UPDATE THE THEME STATE VARIABLE
    
}


@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    if(!isLightThemeEnabled) {
         darkmode.setText("enable light mode");
    }
    else {
        .....
    }
}


@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString("THEME_KEY",isLightThemeEnabled);
    
    super.onSaveInstanceState(outState);
}
,

我对此的看法:

您没有显示将其更改为 Light 模式,我相信这会反映相同的行为。

当您使用 setDefaultNightMode() 更改默认模式时会发生什么,它会在执行此行的那一刻重新创建活动,这意味着您的代码在更改时永远不会到达第二行 setText()默认模式如下图所示。您可以在 official docs 中进一步阅读。

enter image description here

但是,当模式已经改变时,带有 setDefaultNightMode() 的第一行什么都不做,因为模式已经改变,这导致第二次改变文本,这意味着改变文本,要么应该是一种回调机制,或者您必须在更改模式之前更改文本。

此外,您可以在活动重新启动和创建时获取当前模式,并根据当前模式设置文本,这绝对是一种可行的方式。

因此,要检查活动创建或娱乐的模式,您可以这样做:

int currentNightMode = getResources().getConfiguration().uiMode
        & Configuration.UI_MODE_NIGHT_MASK
when(currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO ->
        // Night mode is not active,we're in day time
    Configuration.UI_MODE_NIGHT_YES ->
        // Night mode is active,we're at night!
    Configuration.UI_MODE_NIGHT_UNDEFINED ->
        // We don't know what mode we're in,assume notnight
}

并根据上述情况设置按钮的文本。

你的回答让我读到了我也想实现的这个,我找到了一篇很好的文章,从中引用了代码,在这里阅读 - DayNight — Adding a dark theme to your app

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...