Added multi-language switch

This commit is contained in:
2022-07-05 22:55:32 +08:00
parent e163c958d4
commit 32295e4a2b
22 changed files with 394 additions and 85 deletions

View File

@@ -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
View File

@@ -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>

View File

@@ -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"

View 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);
}
}
}

View File

@@ -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());
}
} }

View File

@@ -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;
} }
} }

View File

@@ -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;
} }
} }

View File

@@ -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;
}
}

View File

@@ -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);
}
} }

View File

@@ -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;
}
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View 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>

View File

@@ -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) {