迁移到androidX后,在运行时以编程方式更改本地化不再适用于pre-Oreo sdk 26。

问题描述 投票:0回答:1

我能够在运行时使用本文档中解释的方法以编程方式改变本地化。文章. 我能够改变应用程序的语言。+ 布局方向 + 工具栏语言。

这是我的代码。

build. gradle

 buildTypes {
        debug {
            pseudoLocalesEnabled true
        }
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.jakewharton:process-phoenix:2.0.0'
}

public class App extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleManager.setLocale(base));
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleManager.setLocale(this);
        if (Build.VERSION.SDK_INT >= 26) {
            ProcessPhoenix.triggerRebirth(this); //An activity must have a category of Default in Manifest!
        }
    }
}

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(Build.VERSION.SDK_INT>=26) {
            LocaleManager.setLocale(this);
        }
        startActivity(new Intent(this,MainActivity.class));
        finish();
    }
}

public class LocaleManager {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
private static final String DEFAULT_LANGUAGE = "en";

public static Context setLocale(Context c) {
    return setNewLocale(c, getLanguage(c));
}

public static Context setNewLocale(Context c, String language) {
    persistLanguage(c, language);
    return updateResources(c, language);
}

public static String getLanguage(Context c) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(c);
    return preferences.getString(SELECTED_LANGUAGE, DEFAULT_LANGUAGE);
}

public static void persistLanguage(Context c, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(c);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(SELECTED_LANGUAGE, language);
    editor.commit(); 
}

private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources res = context.getResources();
    Configuration config = new Configuration(res.getConfiguration());

    if(Build.VERSION.SDK_INT >= 17) {
        config.setLocale(locale);
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
    return context;
}

}


public class MainActivity extends AppCompatActivity {

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

//Change English to arabic when user clicked the button.
public void changeLanguage(View view) {
    LocaleManager.persistLanguage(this ,"ar");
    LocaleManager.setLocale(this);
    ProcessPhoenix.triggerRebirth(this); //An activity must have a category of Default in Manifest!

问题是:在我迁移到androidX之前,这段代码一直在完美地工作。这段代码在我移植到androidX之前一直都能完美运行。现在,它只适用于Android Oreo+的设备。我检查了迁移到androidX之前的备份版本,它工作得很完美。我是否在这里遗漏了什么?

android androidx android-layout-direction
1个回答
0
投票

将'androidx.appcompat:appcompat:1.1.0'的实现改为1.0.0版本,就可以解决这个问题。

另外,如果你使用实现'com.google.android.material:material:1.1.0',将其改为1.0.0版本。

© www.soinside.com 2019 - 2024. All rights reserved.