精华内容
下载资源
问答
  • android 切换系统语言,输入法也随之切换
    2021-06-04 12:08:08

    为什么有时候切换系统语言,输入法也随之切换

    在系统有谷歌拼音输入法(Pinying输入法)和android 键盘输入法(Latin 输入法)的时候,此时系统的输入法不是第三方输入法。

    在这时候去切换系统语言:

    当切换到中文时,不管之前是否是Pinyin输入法(或是Pinyin输入法都没有被勾选),现在都会自动切换到谷歌中文输入法

    当切换到英文时,不管之前是否是Latin输入法(或是Latin 输入法都没有被勾选),现在都会自动切换到android 键盘输入法

    原因:

    在系统完成语言之后,

    首先IME services会通过buildInputMethodListLocked() 把没有勾选的系统输入法都勾选了,

    然后IME services(InputMethodManagerServices.Java)会收到ACTION_LOCALE_CHANGED的广播,

    final IntentFilter filter = new IntentFilter();

    filter.addAction(Intent.ACTION_LOCALE_CHANGED);

    mContext.registerReceiver(

    new BroadcastReceiver() {

    @Override

    public void onReceive(Context context, Intent intent) {

    synchronized(mMethodMap) {

    resetStateIfCurrentLocaleChangedLocked();

    }

    }

    }, filter);

    }

    之后会通过resetStateIfCurrentLocaleChangedLocked() 方法--->最后调用到resetDefaultImeLocked(),

    在resetDefaultImeLocked(),会现判断是否是SYSTEM IME,最后通过setSelectedInputMethodAndSubtypeLocked ()设置当前系统的输入法。

    即完成了输入法随语言切换而改变

    说明:如果当前输入法是第三方的,则上述语言切换之后,输入法不会随之改变。因为在resetDefaultImeLocked()中有关是否是系统输入法的判断,直接阻断了。

    在resetDefaultImeLocked方法的最开始它为做一个判断:

    if (mCurMethodId != null && !InputMethodUtils.isSystemIme(mMethodMap.get(mCurMethodId))) {

    return;

    }

    这是一个android 原始设计。

    更多相关内容
  • Android切换系统语言

    2016-02-18 10:07:46
    Android切换系统语言,可以更改系统的语言,不错哦
  • 简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项“设置系统语言”功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能。起初想来是很简单的事情嘛...
  • Android 切换系统语言

    2021-01-24 22:01:07
    切换系统语言分为下面两个步骤: 1. 创建不同语言资源; 2. 替换当前页面 Context 所持有的资源; 一、创建不同语言资源 创建步骤如下: 二、替换资源 界面需要重新创建,使用 recreate(); 或者 重新...

    切换系统语言分为下面两个步骤:

    1. 创建不同语言资源;

    2. 替换当前页面 Context 所持有的资源;

    一、创建不同语言资源

    创建步骤如下:

    二、替换资源

    • 界面需要重新创建,使用 recreate(); 或者 重新打开界面。
    • 在 attachBaseContext(Context) 方法中替换Context的资源。
      //可以在 BaseActivity 中使用
      @Override
      protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(Utils.attachBaseContext(newBase));
      }
    • 切换配置
    
      public static Context attachBaseContext(Context context) {
        //不同版本设置方式不一样
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          return createResources(context);
        } else {
          updateResources(context);
          return context;
        }
      }
    
    
      @TargetApi(Build.VERSION_CODES.N)
      private static Context createResources(Context context) {
        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        Configuration configuration = resources.getConfiguration();
        //获取语言设置,一般用户设置的语言优先级更高,如果用户没有设置,则获取系统语言
        Locale targetLocale = getLocale(context);
        configuration.setLocale(targetLocale);
        resources.updateConfiguration(configuration, dm);
        //创建配置
        return context.createConfigurationContext(configuration);
      }
    
      public static void updateResources(Context pContext) {
        Locale targetLocale = getLocale(pContext);
        Configuration configuration = pContext.getResources().getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
          configuration.setLocale(targetLocale);
        } else {
          configuration.locale = targetLocale;
        }
        Resources resources = pContext.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        //更新配置
        resources.updateConfiguration(configuration, dm);
      }
    
    • 获取系统语言
      public static Locale getSystemLocale(Context context) {
        Locale locale;
        //7.0有多语言设置获取顶部的语言
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          locale = LocaleList.getDefault().get(0);
        } else {
          locale = context.getResources().getConfiguration().locale;
        }
        return locale;
      }

    注意:

    不能使用 Application 的 Context 来获取文字资源,必须使用 Activity 的 Context;

     

     

    展开全文
  • package ...import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.preference.PreferenceManager;import android.text.TextUti...

    package com.barry.common.util;

    import android.app.Activity;

    import android.content.Intent;

    import android.content.SharedPreferences;

    import android.preference.PreferenceManager;

    import android.text.TextUtils;

    import java.util.Locale;

    /**

    * 切换语言的工具类

    *

    * @author : barry.huang

    * @time : 16/9/21

    **/

    public class LanguageUtil {

    private static final String LAST_LANGUAGE = "lastLanguage";

    /**

    * 当改变系统语言时,重启App

    *

    * @param activity

    * @param homeActivityCls 主activity

    * @return

    */

    public static boolean isLanguageChanged(Activity activity, Class> homeActivityCls) {

    Locale locale = Locale.getDefault();

    if (locale == null) {

    return false;

    }

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(activity);

    String localeStr = sp.getString(LAST_LANGUAGE, "");

    String curLocaleStr = getLocaleString(locale);

    if (TextUtils.isEmpty(localeStr)) {

    sp.edit().putString(LAST_LANGUAGE, curLocaleStr).commit();

    return false;

    } else {

    if (localeStr.equals(curLocaleStr)) {

    return false;

    } else {

    sp.edit().putString(LAST_LANGUAGE, curLocaleStr).commit();

    restartApp(activity, homeActivityCls);

    return true;

    }

    }

    }

    private static String getLocaleString(Locale locale) {

    if (locale == null) {

    return "";

    } else {

    return locale.getCountry() + locale.getLanguage();

    }

    }

    public static void restartApp(Activity activity, Class> homeClass) {

    Intent intent = new Intent(activity, homeClass);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

    activity.startActivity(intent);

    // 杀掉进程

    android.os.Process.killProcess(android.os.Process.myPid());

    System.exit(0);

    }

    }在基类BaseActivity的onCreate()方法里调用LanguageUtil.isLanguageChanged(activity, homeActivityCls).添加权限over.

    展开全文
  • android应用内切换系统语言。用于app支持国际化。
  • Android 切换系统语言功能实现(下)

    千次阅读 2016-03-04 12:47:24
    概述:简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项“设置系统语言”功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能。期初想来是很简单的...

    转载请标明出处: http://blog.csdn.net/u011974987/article/details/50801770

    概述:

    简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项“设置系统语言”功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能。期初想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题。下面介绍下网上找的几个方案。

    一、API欺骗

    烧制到手机中的android.jar包含了Android所需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。

    二、使用Java反射机制

    IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法。
    

    但是这个弊端是显而易见的,上述两种方法都是去更改系统的语言的类型,功能和你去设置页面去设置语言类型的效果一样。发现对当前系统设置了新的Locale后,不单自己的应用语系改变了,系统所有的应用语系都改变了,这正是我们所需要的。折腾了下下这个很2的问题。网上放的方法比较旧, Android5.1的话, 设置后当时生效, 重启后就失效了。

    核心代码如下:

    /**
     * TODO<更新系统语言>
     * 
     * @author Xiho
     * @versionCode 1 <每次修改提交前+1>
     */
    @SuppressWarnings("unchecked")
    public class LanguageUtils {
    
    
        public static void updateLanguage(Locale locale) {
            try {
                Object objIActMag, objActMagNative;
    
                Class clzIActMag = Class.forName("android.app.IActivityManager");
    
                Class clzActMagNative = Class
                        .forName("android.app.ActivityManagerNative");
    
                //amn = ActivityManagerNative.getDefault(); 
                Method mtdActMagNative$getDefault = clzActMagNative
                        .getDeclaredMethod("getDefault");
    
                objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
    
                 // objIActMag = amn.getConfiguration();  
                Method mtdIActMag$getConfiguration = clzIActMag
                        .getDeclaredMethod("getConfiguration");
    
                Configuration config = (Configuration) mtdIActMag$getConfiguration
                        .invoke(objIActMag);
    
                // set the locale to the new value  
                config.locale = locale;
    
                //持久化   config.userSetLocale = true; 
                Class clzConfig = Class
                        .forName("android.content.res.Configuration");
                java.lang.reflect.Field userSetLocale = clzConfig
                        .getField("userSetLocale");
                userSetLocale.set(config, true);
    
                // 此处需要声明权限:android.permission.CHANGE_CONFIGURATION
                // 会重新调用 onCreate();
                Class[] clzParams = { Configuration.class };
    
                // objIActMag.updateConfiguration(config);
                Method mtdIActMag$updateConfiguration = clzIActMag
                        .getDeclaredMethod("updateConfiguration", clzParams);
    
                mtdIActMag$updateConfiguration.invoke(objIActMag, config);
    
                BackupManager.dataChanged("com.android.providers.settings");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    这样我们利用JAVA的反射机制,调用那些隐藏的方法就可以实现了。

    • 需要注意的是调用此方法:
    // objIActMag.updateConfiguration(config);
    mtdIActMag$updateConfiguration.invoke(objIActMag, config);
    

    需要加上权限:

    android.permission.CHANGE_CONFIGURATION

    并且此处会重新调用onCreate方法,我就在这个地方处被坑了一把。(如果调用此方法的时候做了一些逻辑,就注意下)。

    不同的地方在添加了

    Class clzConfig = Class.forName("android.content.res.Configuration"); 
    java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale"); 
    userSetLocale.set(config, true);

    Debug发现的逻辑是:
    1: 持久化保存下来

    SystemProperties.set("persist.sys.language", l.getLanguage());
    SystemProperties.set("persist.sys.country", l.getCountry());

    2: 开机AndroidRuntime读取这个属性, 更新系统之前的属性。估计是为了方便跑测试的Case添加的这个逻辑。

    最后声明:

    既然是更改系统的配置当然你的签名也应该是系统签名和sharedUserId。不然会类似以下的错误!

    error:

    java.lang.SecurityException: Permission Denial: updateConfiguration() from pid=31594, uid=10099 requires android.permission.CHANGE_CONFIGURATION

    各位都注意下吧~

    附上GitHub源码:SwitchLanguage

    welcome everyone’s Star and fork!

    这里写图片描述

    展开全文
  • 最近做的一个升级应用,在下载升级包的过程中又有一个toast类型的dialog悬浮在屏幕右上角,这个时候切换系统语言会出现问题。当主屏幕为升级应用时,切换系统语言升级应用重启,而重启后并不能自动断点续传切换前的...
  • Android APP切换系统语言

    千次阅读 2019-08-22 11:24:04
    三方APP实现点击切换语言功能(类似于系统Settings中点击语言自动切换) 2.实现 2.1 跳转到系统Settings的语言选择界面,实现功能 跳转代码: Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS)...
  • Android动态系统语言切换https://blog.csdn.net/u012560369/article/details/89141075
  • 需要完成的功能是点击指定按钮后修改系统语言,并让应用跟随系统切换语言privatevoidswitchLanguage(){IActivityManageram=ActivityManagerNative.getDefault();Configurationconfig=null;try{config=am.get...
  • 本篇文章主要介绍了Android 系统语言切换监听和设置实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 背景:最近做了一个印尼的项目,用的是AndroidX库。项目需要做中、英、印尼三种语言的切换切换多语言时候重启MainActivity,在Application和BaseActivity里重写attachBaseContext方法去设置Context。 问题:我的...
  • Android 切换系统语言源码分析(上)

    千次阅读 2016-03-04 00:10:11
    本文出自:【二锅头的博客】 以前了解Android的多语言实现很简单,可以在不同的语言环境下使用不同的资源,... 最近公司的项目要用到多国语言切换,并且还是和手机上系统设置里面的语言切换功能一样,于是就上网查了
  • Android APP切换系统语言
  • 一:网上能搜到的解决方法: 方法:在AndroidManifest.xml中Activity节点中配置android:configChanges=...2.如果不添加,app运行时,切换系统语言会导致当前的Activity被销毁并重新创建,即先调用onDestroy()紧接着...
  • 最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知。为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料。(主要参考了...
  • 最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果   和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成,下次重新打开...
  • 【PConline 资讯】此前曾经有消息称,不少厂商都计划推出安卓/Windows双启动设备,增强安卓和Windows 8.1平板对消费者的吸引力。现在一年一度的CES展会已经...Intel:安卓/Windows双系统可一键切换在今年的CES展会...
  • Android 8.0系统界面切换时闪屏问题
  • 无法切换输入法的原因是在Android系统中打开的基础服务. 常规输入法软件设计规范要求可以随时将其切换为其他输入法. 但是,由于三方输入法的自私性和其他原因,使用这些输入法时,用户无法切换到他们想要使用的其他...
  • 系统如何进行切换

    千次阅读 2021-06-08 01:48:50
    02双系统如何进行切换?■双系统怎么切换使用?台电X98 Air 3G(双系统版)在开机后进入选择系统界面,我们选择其中一个系统,点击确认,就能进入自己所需的系统。在选系统界面里,左上角有一个选项,这选项是用户根据...
  • 解决方案: AndroidManifest.xml中configChanges中追加 “fontScale” configChanges="orientation|screenSize|keyboardHidden|fontScale
  • 最近有需求需要切换系统语言的功能,查阅api最终搞定,代码分享如下: 1.切换语言 public void updateLanguage(Locale locale) { try { Object objIActMag; Class clzIActMag = Class.forName("android.app....
  • android 9支持多用户切换吗?消息说是支持的呢Android中的APP如何实现多帐号切换?这个并不难,你可以同时在服务器的数据库中关联一个主键下的多个账户,每一个账户都有唯一的主键,用主键可以便利所有的账户,在...
  • 主要为大家详细介绍了Android实现应用内置语言切换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 本篇文章主要介绍了Android 7.0以上版本实现应用内语言切换的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 154,024
精华内容 61,609
关键字:

安卓切换系统

友情链接: fft8_3.rar