mirror of
https://github.com/FatttSnake/OxygenToolbox.git
synced 2026-04-06 04:11:26 +08:00
Added multi-language switch
This commit is contained in:
12
.idea/deploymentTargetDropDown.xml
generated
12
.idea/deploymentTargetDropDown.xml
generated
@@ -1,18 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="deploymentTargetDropDown">
|
<component name="deploymentTargetDropDown">
|
||||||
<targetSelectedWithDropDown>
|
|
||||||
<Target>
|
|
||||||
<type value="QUICK_BOOT_TARGET" />
|
|
||||||
<deviceKey>
|
|
||||||
<Key>
|
|
||||||
<type value="VIRTUAL_DEVICE_PATH" />
|
|
||||||
<value value="G:\Android\Avd\Pixel_4_API_31.avd" />
|
|
||||||
</Key>
|
|
||||||
</deviceKey>
|
|
||||||
</Target>
|
|
||||||
</targetSelectedWithDropDown>
|
|
||||||
<timeTargetWasSelectedWithDropDown value="2022-06-23T16:42:02.203822300Z" />
|
|
||||||
<runningDeviceTargetsSelectedWithDialog>
|
<runningDeviceTargetsSelectedWithDialog>
|
||||||
<Target>
|
<Target>
|
||||||
<type value="RUNNING_DEVICE_TARGET" />
|
<type value="RUNNING_DEVICE_TARGET" />
|
||||||
|
|||||||
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
@@ -56,6 +56,7 @@
|
|||||||
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/menu/main.xml" value="0.1" />
|
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/menu/main.xml" value="0.1" />
|
||||||
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.11944444444444445" />
|
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.11944444444444445" />
|
||||||
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.11944444444444445" />
|
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.11944444444444445" />
|
||||||
|
<entry key="..\:/.workspace-android/Project-ToolBox/OxygenToolbox/app/src/main/res/xml/fragment_setting.xml" value="0.33" />
|
||||||
</map>
|
</map>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
android:name=".App"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|||||||
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;
|
package com.fatapp.oxygentoolbox;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
|
||||||
|
import com.fatapp.oxygentoolbox.util.MultiLanguageUtils;
|
||||||
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
||||||
import com.fatapp.oxygentoolbox.util.VibratorController;
|
import com.fatapp.oxygentoolbox.util.VibratorController;
|
||||||
import com.google.android.material.navigation.NavigationView;
|
import com.google.android.material.navigation.NavigationView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||||
import androidx.navigation.NavController;
|
import androidx.navigation.NavController;
|
||||||
import androidx.navigation.Navigation;
|
import androidx.navigation.Navigation;
|
||||||
@@ -46,7 +49,6 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
//init
|
//init
|
||||||
initView();
|
initView();
|
||||||
initLayout();
|
initLayout();
|
||||||
ResourceUtil.init(getApplication());
|
|
||||||
VibratorController.init();
|
VibratorController.init();
|
||||||
|
|
||||||
// shortCutCreateTest();
|
// shortCutCreateTest();
|
||||||
@@ -58,11 +60,9 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
navigationView.inflateHeaderView(R.layout.nav_header_main);
|
navigationView.inflateHeaderView(R.layout.nav_header_main);
|
||||||
navigationView.inflateMenu(R.menu.activity_main_drawer);
|
navigationView.inflateMenu(R.menu.activity_main_drawer);
|
||||||
navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
navigationView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked()
|
||||||
drawer.setDrawerLockMode(navigationView.getMenu().getItem(0).isChecked()
|
? DrawerLayout.LOCK_MODE_UNLOCKED
|
||||||
? DrawerLayout.LOCK_MODE_UNLOCKED
|
: DrawerLayout.LOCK_MODE_LOCKED_CLOSED));
|
||||||
: DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
|
|
||||||
});
|
|
||||||
navigationView.getMenu().getItem(4).setOnMenuItemClickListener(item -> {
|
navigationView.getMenu().getItem(4).setOnMenuItemClickListener(item -> {
|
||||||
finish();
|
finish();
|
||||||
return false;
|
return false;
|
||||||
@@ -112,4 +112,15 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|
||||||
|| super.onSupportNavigateUp();
|
|| 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;
|
package com.fatapp.oxygentoolbox.ui.setting;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.widget.Toast;
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
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.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,
|
@Override
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
|
||||||
settingViewModel = new ViewModelProvider(this).get(SettingViewModel.class);
|
setPreferencesFromResource(R.xml.fragment_setting, rootKey);
|
||||||
View root = inflater.inflate(R.layout.fragment_setting, container, false);
|
ListPreference appLanguage = findPreference("app_language");
|
||||||
/*
|
if (appLanguage != null) {
|
||||||
final TextView textView = root.findViewById(R.id.text_setting);
|
appLanguage.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||||
settingViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
|
Intent intent = new Intent(getActivity(), MainActivity.class);
|
||||||
@Override
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
public void onChanged(@Nullable String s) {
|
requireActivity().startActivity(intent);
|
||||||
textView.setText(s);
|
requireActivity().finish();
|
||||||
}
|
return true;
|
||||||
});
|
});
|
||||||
*/
|
}
|
||||||
return root;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,12 +4,9 @@ import android.os.Bundle;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.lifecycle.Observer;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
import com.fatapp.oxygentoolbox.R;
|
import com.fatapp.oxygentoolbox.R;
|
||||||
@@ -21,13 +18,6 @@ public class ThemeFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
themeViewModel = new ViewModelProvider(this).get(ThemeViewModel.class);
|
themeViewModel = new ViewModelProvider(this).get(ThemeViewModel.class);
|
||||||
View root = inflater.inflate(R.layout.fragment_theme, container, false);
|
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;
|
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.annotation.SuppressLint;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
|
||||||
import androidx.annotation.AttrRes;
|
import androidx.annotation.AttrRes;
|
||||||
@@ -13,19 +16,20 @@ import androidx.annotation.ColorInt;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.StyleRes;
|
import androidx.annotation.StyleRes;
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
import androidx.appcompat.view.ContextThemeWrapper;
|
||||||
|
import androidx.core.os.ConfigurationCompat;
|
||||||
|
import androidx.core.os.LocaleListCompat;
|
||||||
|
|
||||||
import com.google.android.material.color.MaterialColors;
|
import com.google.android.material.color.MaterialColors;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public final class ResourceUtil {
|
public final class ResourceUtil {
|
||||||
|
|
||||||
private static Application sApp;
|
private static Application sApp;
|
||||||
private static Resources sRes;
|
|
||||||
|
|
||||||
public static void init(Application app) {
|
public static void init(Application app) {
|
||||||
sApp = app;
|
sApp = app;
|
||||||
sRes = app.getResources();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Application getApplication() {
|
public static Application getApplication() {
|
||||||
@@ -33,15 +37,23 @@ public final class ResourceUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Resources getResources() {
|
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) {
|
public static String getString(int resId) {
|
||||||
return sRes.getString(resId);
|
return sApp.getResources().getString(resId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getColor(int resId) {
|
public static int getColor(int resId) {
|
||||||
return sRes.getColor(resId);
|
return sApp.getResources().getColor(resId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ColorInt
|
@ColorInt
|
||||||
@@ -82,4 +94,19 @@ public final class ResourceUtil {
|
|||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path
|
<path
|
||||||
android:fillColor="@color/default_app_theme"
|
android:fillColor="@color/white"
|
||||||
android:fillType="nonZero"
|
android:fillType="nonZero"
|
||||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||||
android:strokeWidth="1"
|
android:strokeWidth="1"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path
|
<path
|
||||||
android:fillColor="@color/default_app_theme"
|
android:fillColor="@color/white"
|
||||||
android:fillType="nonZero"
|
android:fillType="nonZero"
|
||||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||||
android:strokeWidth="1"
|
android:strokeWidth="1"
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context=".ui.setting.SettingFragment">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
@@ -1,22 +1,37 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:padding="15dp"
|
||||||
tools:context=".ui.theme.ThemeFragment">
|
tools:context=".ui.theme.ThemeFragment">
|
||||||
|
|
||||||
<TextView
|
<LinearLayout
|
||||||
android:id="@+id/text_theme"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="8dp"
|
android:orientation="vertical">
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginEnd="8dp"
|
<LinearLayout
|
||||||
android:textAlignment="center"
|
android:layout_width="match_parent"
|
||||||
android:textSize="20sp"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
android:orientation="horizontal">
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
<TextView
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
android:layout_width="0dp"
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/setting_dark_mode"
|
||||||
|
android:textColor="?attr/app_text_theme"
|
||||||
|
android:textSize="@dimen/default_text_size" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatSpinner
|
||||||
|
android:id="@+id/theme_dark_mode_spinner"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:entries="@array/setting_dark_theme_selects_array"
|
||||||
|
android:spinnerMode="dropdown"
|
||||||
|
android:theme="@style/ThemeSpinner" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
android:id="@+id/nav_setting"
|
android:id="@+id/nav_setting"
|
||||||
android:name="com.fatapp.oxygentoolbox.ui.setting.SettingFragment"
|
android:name="com.fatapp.oxygentoolbox.ui.setting.SettingFragment"
|
||||||
android:label="@string/menu_setting"
|
android:label="@string/menu_setting"
|
||||||
tools:layout="@layout/fragment_setting" />
|
tools:layout="@xml/fragment_setting" />
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/nav_about"
|
android:id="@+id/nav_about"
|
||||||
|
|||||||
@@ -22,4 +22,16 @@
|
|||||||
|
|
||||||
<string name="init_tools_failed">初始化工具集失败</string>
|
<string name="init_tools_failed">初始化工具集失败</string>
|
||||||
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
||||||
|
|
||||||
|
<string name="setting_dark_mode">深色主题</string>
|
||||||
|
|
||||||
|
<string name="setting_base_settings">基本设置</string>
|
||||||
|
<string name="setting_language">语言</string>
|
||||||
|
<string name="setting_launch_page">启动页</string>
|
||||||
|
|
||||||
|
<string-array name="setting_language_array">
|
||||||
|
<item>跟随系统</item>
|
||||||
|
<item>中文</item>
|
||||||
|
<item>English</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -22,4 +22,16 @@
|
|||||||
|
|
||||||
<string name="init_tools_failed">初始化工具集失败</string>
|
<string name="init_tools_failed">初始化工具集失败</string>
|
||||||
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
||||||
|
|
||||||
|
<string name="setting_dark_mode">深色主题</string>
|
||||||
|
|
||||||
|
<string name="setting_base_settings">基本设置</string>
|
||||||
|
<string name="setting_language">语言</string>
|
||||||
|
<string name="setting_launch_page">启动页</string>
|
||||||
|
|
||||||
|
<string-array name="setting_language_array">
|
||||||
|
<item>跟随系统</item>
|
||||||
|
<item>中文</item>
|
||||||
|
<item>English</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -22,4 +22,16 @@
|
|||||||
|
|
||||||
<string name="init_tools_failed">初始化工具集失败</string>
|
<string name="init_tools_failed">初始化工具集失败</string>
|
||||||
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
<string name="activity_class_not_found">无法加载工具,该工具可能已损坏</string>
|
||||||
|
|
||||||
|
<string name="setting_dark_mode">深色主题</string>
|
||||||
|
|
||||||
|
<string name="setting_base_settings">基本设置</string>
|
||||||
|
<string name="setting_language">语言</string>
|
||||||
|
<string name="setting_launch_page">启动页</string>
|
||||||
|
|
||||||
|
<string-array name="setting_language_array">
|
||||||
|
<item>跟随系统</item>
|
||||||
|
<item>中文</item>
|
||||||
|
<item>English</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -24,4 +24,26 @@
|
|||||||
|
|
||||||
<string name="init_tools_failed">Failed to initialize tools</string>
|
<string name="init_tools_failed">Failed to initialize tools</string>
|
||||||
<string name="activity_class_not_found">Can not load tool, it may be damaged</string>
|
<string name="activity_class_not_found">Can not load tool, it may be damaged</string>
|
||||||
|
|
||||||
|
<string name="setting_dark_mode">Dark Theme</string>
|
||||||
|
<string-array name="setting_dark_theme_selects_array">
|
||||||
|
<item>Follow Device</item>
|
||||||
|
<item>Light</item>
|
||||||
|
<item>Dark</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="setting_base_settings">Base Settings</string>
|
||||||
|
<string name="setting_language">Language</string>
|
||||||
|
<string name="setting_language_key" translatable="false">app_language</string>
|
||||||
|
<string-array name="setting_language_array">
|
||||||
|
<item>Follow System</item>
|
||||||
|
<item>中文</item>
|
||||||
|
<item>English</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="setting_language_values">
|
||||||
|
<item>default</item>
|
||||||
|
<item>zh_CN</item>
|
||||||
|
<item>en_US</item>
|
||||||
|
</string-array>
|
||||||
|
<string name="setting_launch_page">Launch Page</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -19,4 +19,8 @@
|
|||||||
<item name="android:layout_width">wrap_content</item>
|
<item name="android:layout_width">wrap_content</item>
|
||||||
<item name="android:layout_height">wrap_content</item>
|
<item name="android:layout_height">wrap_content</item>
|
||||||
</style>
|
</style>
|
||||||
|
<style name="ThemeSpinner" parent="Widget.AppCompat.Light.DropDownItem.Spinner">
|
||||||
|
<item name="android:textSize">@dimen/default_text_size</item>
|
||||||
|
<item name="android:textColor">?attr/app_text_theme</item>
|
||||||
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
21
app/src/main/res/xml/fragment_setting.xml
Normal file
21
app/src/main/res/xml/fragment_setting.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<PreferenceCategory app:title="@string/setting_base_settings">
|
||||||
|
<ListPreference
|
||||||
|
app:defaultValue="default"
|
||||||
|
app:entries="@array/setting_language_array"
|
||||||
|
app:entryValues="@array/setting_language_values"
|
||||||
|
app:key="@string/setting_language_key"
|
||||||
|
app:title="@string/setting_language"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
app:key="help_category"
|
||||||
|
app:title="Help">
|
||||||
|
<Preference
|
||||||
|
app:key="feedback"
|
||||||
|
app:summary="Report technical issues or suggest new features"
|
||||||
|
app:title="Send feedback" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '7.1.2' apply false
|
id 'com.android.application' version '7.2.1' apply false
|
||||||
id 'com.android.library' version '7.1.2' apply false
|
id 'com.android.library' version '7.2.1' apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
task clean(type: Delete) {
|
task clean(type: Delete) {
|
||||||
|
|||||||
Reference in New Issue
Block a user