【问题标题】:.setText(" text ") is not working properly in android studio.setText(" text ") 在 android studio 中无法正常工作
【发布时间】:2021-02-07 08:28:25
【问题描述】:

我是 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 的应用程序的行为方式

【问题讨论】:

标签: android android-studio settext


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我对此的看法:

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

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

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

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多