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

.setText(" text ") is not working properly in 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

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

您可以阅读更多相关信息 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);
}

我对此的看法:

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

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

中进一步阅读

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

此外,您可以在 activity 重新启动和创建时获取当前模式,并根据当前模式设置文本,这绝对是首选。

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

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