mirror of
https://github.com/FatttSnake/OxygenToolbox.git
synced 2026-04-06 09:41:26 +08:00
Added multi-language switch
This commit is contained in:
107
app/src/main/java/com/fatapp/oxygentoolbox/App.java
Normal file
107
app/src/main/java/com/fatapp/oxygentoolbox/App.java
Normal file
@@ -0,0 +1,107 @@
|
||||
package com.fatapp.oxygentoolbox;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.LocaleList;
|
||||
import android.util.DisplayMetrics;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.fatapp.oxygentoolbox.util.MultiLanguageUtils;
|
||||
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
||||
import com.fatapp.oxygentoolbox.util.SharedPreferencesUtils;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class App extends Application {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
|
||||
@Override
|
||||
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle bundle) {
|
||||
ResourceUtil.init(App.this);
|
||||
SharedPreferencesUtils.init(App.this);
|
||||
String locale = SharedPreferencesUtils.getLocale();
|
||||
String language;
|
||||
String country;
|
||||
if (!locale.equals("default")) {
|
||||
language = locale.substring(0, locale.indexOf("_"));
|
||||
country = locale.substring(locale.indexOf("_") + 1);
|
||||
} else {
|
||||
language = ResourceUtil.getSystemLocale().get(0).getLanguage();
|
||||
country = ResourceUtil.getSystemLocale().get(0).getCountry();
|
||||
}
|
||||
setAppLanguage(getApplicationContext(), new Locale(language, country));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityStarted(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResumed(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityPaused(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityStopped(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityDestroyed(@NonNull Activity activity) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(MultiLanguageUtils.attachBaseContext(base));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(@NonNull Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
MultiLanguageUtils.attachBaseContext(this);
|
||||
}
|
||||
|
||||
|
||||
private static void setAppLanguage(Context context, Locale locale) {
|
||||
Resources resources = context.getResources();
|
||||
Configuration configuration = resources.getConfiguration();
|
||||
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
|
||||
//Android 7.0以上的方法
|
||||
if (Build.VERSION.SDK_INT >= 24) {
|
||||
configuration.setLocale(locale);
|
||||
configuration.setLocales(new LocaleList(locale));
|
||||
context.createConfigurationContext(configuration);
|
||||
//实测,updateConfiguration这个方法虽然很多博主说是版本不适用
|
||||
//但是我的生产环境androidX+Android Q环境下,必须加上这一句,才可以通过重启App来切换语言
|
||||
resources.updateConfiguration(configuration, displayMetrics);
|
||||
} else {
|
||||
//Android 4.1 以上方法
|
||||
configuration.setLocale(locale);
|
||||
resources.updateConfiguration(configuration, displayMetrics);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
package com.fatapp.oxygentoolbox;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
|
||||
import com.fatapp.oxygentoolbox.util.MultiLanguageUtils;
|
||||
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
||||
import com.fatapp.oxygentoolbox.util.VibratorController;
|
||||
import com.google.android.material.navigation.NavigationView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.Navigation;
|
||||
@@ -46,7 +49,6 @@ public class MainActivity extends AppCompatActivity {
|
||||
//init
|
||||
initView();
|
||||
initLayout();
|
||||
ResourceUtil.init(getApplication());
|
||||
VibratorController.init();
|
||||
|
||||
// shortCutCreateTest();
|
||||
@@ -58,11 +60,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
setSupportActionBar(toolbar);
|
||||
navigationView.inflateHeaderView(R.layout.nav_header_main);
|
||||
navigationView.inflateMenu(R.menu.activity_main_drawer);
|
||||
navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
||||
drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked()
|
||||
? DrawerLayout.LOCK_MODE_UNLOCKED
|
||||
: DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
|
||||
});
|
||||
navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked()
|
||||
? DrawerLayout.LOCK_MODE_UNLOCKED
|
||||
: DrawerLayout.LOCK_MODE_LOCKED_CLOSED));
|
||||
navigationView.getMenu().getItem(4).setOnMenuItemClickListener(item -> {
|
||||
finish();
|
||||
return false;
|
||||
@@ -112,4 +112,15 @@ public class MainActivity extends AppCompatActivity {
|
||||
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|
||||
|| super.onSupportNavigateUp();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context newBase) {
|
||||
super.attachBaseContext(MultiLanguageUtils.attachBaseContext(newBase));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
MultiLanguageUtils.attachBaseContext(getApplicationContext());
|
||||
}
|
||||
}
|
||||
@@ -1,33 +1,38 @@
|
||||
package com.fatapp.oxygentoolbox.ui.setting;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import com.fatapp.oxygentoolbox.MainActivity;
|
||||
import com.fatapp.oxygentoolbox.R;
|
||||
import com.fatapp.oxygentoolbox.util.MultiLanguageUtils;
|
||||
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
||||
|
||||
public class SettingFragment extends Fragment {
|
||||
import java.util.Objects;
|
||||
|
||||
private SettingViewModel settingViewModel;
|
||||
public class SettingFragment extends PreferenceFragmentCompat {
|
||||
|
||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||
ViewGroup container, Bundle savedInstanceState) {
|
||||
settingViewModel = new ViewModelProvider(this).get(SettingViewModel.class);
|
||||
View root = inflater.inflate(R.layout.fragment_setting, container, false);
|
||||
/*
|
||||
final TextView textView = root.findViewById(R.id.text_setting);
|
||||
settingViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
|
||||
@Override
|
||||
public void onChanged(@Nullable String s) {
|
||||
textView.setText(s);
|
||||
}
|
||||
});
|
||||
*/
|
||||
return root;
|
||||
@Override
|
||||
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
|
||||
setPreferencesFromResource(R.xml.fragment_setting, rootKey);
|
||||
ListPreference appLanguage = findPreference("app_language");
|
||||
if (appLanguage != null) {
|
||||
appLanguage.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
Intent intent = new Intent(getActivity(), MainActivity.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
requireActivity().startActivity(intent);
|
||||
requireActivity().finish();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,12 +4,9 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.fatapp.oxygentoolbox.R;
|
||||
@@ -21,13 +18,6 @@ public class ThemeFragment extends Fragment {
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
themeViewModel = new ViewModelProvider(this).get(ThemeViewModel.class);
|
||||
View root = inflater.inflate(R.layout.fragment_theme, container, false);
|
||||
final TextView textView = root.findViewById(R.id.text_theme);
|
||||
themeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
|
||||
@Override
|
||||
public void onChanged(@Nullable String s) {
|
||||
textView.setText(s);
|
||||
}
|
||||
});
|
||||
return root;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.fatapp.oxygentoolbox.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.LocaleList;
|
||||
import android.text.TextUtils;
|
||||
import android.util.DisplayMetrics;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.appcompat.view.ContextThemeWrapper;
|
||||
import androidx.core.os.ConfigurationCompat;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
|
||||
import com.fatapp.oxygentoolbox.R;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class MultiLanguageUtils {
|
||||
|
||||
public static Context attachBaseContext(Context context) {
|
||||
String locale;
|
||||
if (SharedPreferencesUtils.isNull()) {
|
||||
locale = "default";
|
||||
} else {
|
||||
locale = SharedPreferencesUtils.getLocale();
|
||||
}
|
||||
String language;
|
||||
String country;
|
||||
if (!locale.equals("default")) {
|
||||
language = locale.substring(0, locale.indexOf("_"));
|
||||
country = locale.substring(locale.indexOf("_") + 1);
|
||||
} else {
|
||||
language = ResourceUtil.getSystemLocale().get(0).getLanguage();
|
||||
country = ResourceUtil.getSystemLocale().get(0).getCountry();
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||
return createConfigurationContext(context, language, country);
|
||||
} else {
|
||||
return updateConfiguration(context, language, country);
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.N_MR1)
|
||||
private static Context createConfigurationContext(Context context, String language, String country) {
|
||||
Resources resources = context.getResources();
|
||||
Configuration configuration = resources.getConfiguration();
|
||||
Locale locale = new Locale(language, country);
|
||||
LocaleList localeList = new LocaleList(locale);
|
||||
configuration.setLocales(localeList);
|
||||
return context.createConfigurationContext(configuration);
|
||||
}
|
||||
|
||||
private static Context updateConfiguration(Context context, String language, String country) {
|
||||
Resources resources = context.getResources();
|
||||
Configuration configuration = resources.getConfiguration();
|
||||
Locale locale = new Locale(language, country);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
configuration.setLocales(new LocaleList(locale));
|
||||
} else {
|
||||
configuration.locale = locale;
|
||||
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
|
||||
resources.updateConfiguration(configuration, displayMetrics);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,12 @@ package com.fatapp.oxygentoolbox.util;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.Window;
|
||||
|
||||
import androidx.annotation.AttrRes;
|
||||
@@ -13,19 +16,20 @@ import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StyleRes;
|
||||
import androidx.appcompat.view.ContextThemeWrapper;
|
||||
import androidx.core.os.ConfigurationCompat;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
|
||||
import com.google.android.material.color.MaterialColors;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
public final class ResourceUtil {
|
||||
|
||||
private static Application sApp;
|
||||
private static Resources sRes;
|
||||
|
||||
public static void init(Application app) {
|
||||
sApp = app;
|
||||
sRes = app.getResources();
|
||||
}
|
||||
|
||||
public static Application getApplication() {
|
||||
@@ -33,15 +37,23 @@ public final class ResourceUtil {
|
||||
}
|
||||
|
||||
public static Resources getResources() {
|
||||
return sRes;
|
||||
return sApp.getResources();
|
||||
}
|
||||
|
||||
public static Configuration getConfiguration() {
|
||||
return sApp.getResources().getConfiguration();
|
||||
}
|
||||
|
||||
public static DisplayMetrics getDisplayMetrics() {
|
||||
return sApp.getResources().getDisplayMetrics();
|
||||
}
|
||||
|
||||
public static String getString(int resId) {
|
||||
return sRes.getString(resId);
|
||||
return sApp.getResources().getString(resId);
|
||||
}
|
||||
|
||||
public static int getColor(int resId) {
|
||||
return sRes.getColor(resId);
|
||||
return sApp.getResources().getColor(resId);
|
||||
}
|
||||
|
||||
@ColorInt
|
||||
@@ -82,4 +94,19 @@ public final class ResourceUtil {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static Locale getAppLocale() {
|
||||
Locale local;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
local = getConfiguration().getLocales().get(0);
|
||||
} else {
|
||||
local = getConfiguration().locale;
|
||||
}
|
||||
return local;
|
||||
}
|
||||
|
||||
public static LocaleListCompat getSystemLocale() {
|
||||
Configuration configuration = Resources.getSystem().getConfiguration();
|
||||
return ConfigurationCompat.getLocales(configuration);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.fatapp.oxygentoolbox.util;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
public class SharedPreferencesUtils {
|
||||
private static SharedPreferences preferences;
|
||||
|
||||
public static void init(Application app) {
|
||||
preferences = PreferenceManager.getDefaultSharedPreferences(app);
|
||||
}
|
||||
|
||||
public static String getLocale() {
|
||||
return preferences.getString("app_language", "default");
|
||||
}
|
||||
|
||||
public static boolean isNull() {
|
||||
return preferences == null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user