Android 系统语言切换

本文介绍如何在Android系统中实现语言切换。内容涉及获取系统权限,理解Android的国际化设置,以及通过代码动态更改应用和系统语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、要使自己的APK拥有系统权限(拥有系统的share进程和系统签名)

android:sharedUserId="android.uid.system" //签名详见之前的博客
2、strings里面写支持的语言
<string name="simplified_chinese">中文(简体)</string>
<string name="traditional_chinese">中文(繁體)</string>
<string name="language_english">English</string>
<string name="language_korea">한국어</string>
<string name="language_japan">日本語</string>

public class LanguageFragment extends RTBaseFragment implements OnItemClickListener {
	private String TAG = "LanguageFragment";
	private ListView language_lv;
	private String[] languageItemString = null;
//	private final Locale[] languageLocalString = new Locale[]{Locale.SIMPLIFIED_CHINESE,Locale.TRADITIONAL_CHINESE,Locale.US,Locale.KOREA,Locale.JAPAN};
	private final Locale[] languageLocalString = new Locale[]{Locale.SIMPLIFIED_CHINESE,Locale.US};
	private List<LanguageInfo> mListLanguageInfo;
	private LanguageAdapter languageAdapter;
	private int selectPosition = 0;//默认显示第一个
	@Override
	protected int setView() {
		return R.layout.language_fragment_layout;
	}

	@Override
	protected void initView(View view) {
		language_lv = (ListView) view.findViewById(R.id.language_lv);
		
//		languageItemString = new String[]{mContext.getString(R.string.simplified_chinese),mContext.getString(R.string.traditional_chinese),
//				mContext.getString(R.string.language_english),mContext.getString(R.string.language_korea),mContext.getString(R.string.language_japan)};
		languageItemString = new String[]{mContext.getString(R.string.simplified_chinese),mContext.getString(R.string.language_english)};
		getListData();
		initLanguage();
		languageAdapter = new LanguageAdapter(mListLanguageInfo);
		language_lv.setAdapter(languageAdapter);
	}

	@Override
	protected void initEvent() {
		language_lv.setOnItemClickListener(this);
	}
	
	@Override
	protected void initData() {
		
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		LanguageInfo mInfo = mListLanguageInfo.get(position);
		updateLanguage(mInfo);
		selectPosition = position;
		languageAdapter.notifyDataSetChanged();
		
	}
	
	public class LanguageAdapter extends BaseAdapter{
		private List<LanguageInfo> list;
		public LanguageAdapter(List<LanguageInfo> listDates){
			list = listDates;
		}
		
		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			ViewHolder viewHolder = null;
			if(convertView==null){
				convertView = LayoutInflater.from(mContext).inflate(R.layout.language_list_item, null);
				viewHolder = new ViewHolder();
				viewHolder.radioButton = (RadioButton) convertView.findViewById(R.id.language_list_item_rb);
				convertView.setTag(viewHolder);
			}else{
				viewHolder = (ViewHolder) convertView.getTag();
			}
			viewHolder.radioButton.setText(list.get(position).getLanguage());
			if(selectPosition == position){
                viewHolder.radioButton.setChecked(true);
            }
            else{
                viewHolder.radioButton.setChecked(false);
            }
			
			return convertView;
		}
		
		public class ViewHolder{
			public RadioButton radioButton;
		}
		
	}
	/**
	 * 初始化本地语言
	 */
	private void initLanguage() {
		Locale currentLocale = getCurrentLocale(mContext);
		for (int i = 0; i < mListLanguageInfo.size(); i++) {
			Locale temp = mListLanguageInfo.get(i).getLocale();
			if(temp.equals(currentLocale)){
				//标记当前item
				selectPosition = i;
				return;
			}
		}
	}
	
	/**
	 * 获取数据
	 * @return
	 */
	public void getListData() {
		mListLanguageInfo = new ArrayList<LanguageInfo>();
        for (int i = 0; i < languageItemString.length; i++) {
        	LanguageInfo mLanguageInfo = new LanguageInfo();
        	mLanguageInfo.setLanguage(languageItemString[i]);
        	mLanguageInfo.setLocale(languageLocalString[i]);
        	mListLanguageInfo.add(mLanguageInfo);
		}
	}
	/**
	 * 更换语言
	 * @param info
	 */
	public void updateLanguage(final LanguageInfo info){
		new Thread(new Runnable() {
			@Override
			public void run() {
				// 更改系统语言
				UpdateLanguageUtils.updateLanguage(info.getLocale());
			}
		}).start();
	}
	/**
	 * 获取当前系统语言
	 * @param mContext
	 * @return
	 */
	public Locale getCurrentLocale(Context mContext){
		Locale locale = mContext.getResources().getConfiguration().locale;
		return locale;
	}
}
4、
public class UpdateLanguageUtils {
	public static void updateLanguage(Locale locale) {
		try {
			Object objIActMag, objActMagNative;

			Class clzIActMag = Class.forName("android.app.IActivityManager");

			Class clzActMagNative = Class
					.forName("android.app.ActivityManagerNative");

			Method mtdActMagNative$getDefault = clzActMagNative
					.getDeclaredMethod("getDefault");

			objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);

			Method mtdIActMag$getConfiguration = clzIActMag
					.getDeclaredMethod("getConfiguration");

			Configuration config = (Configuration) mtdIActMag$getConfiguration
					.invoke(objIActMag);

			config.locale = locale;

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

			Class[] clzParams = { Configuration.class };

			Method mtdIActMag$updateConfiguration = clzIActMag
					.getDeclaredMethod("updateConfiguration", clzParams);

			mtdIActMag$updateConfiguration.invoke(objIActMag, config);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

5、listview 的 Item布局

<RadioButton 
        android:id="@+id/language_list_item_rb"
        style="@style/volume_fragment_rb_stytle"
        android:checked="false"
        android:clickable="false"
        android:focusable="false"
        />
<style name="volume_fragment_rb_stytle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">@android:color/white</item>
        <item name="android:button">@drawable/radio_button_selecter</item>
        <item name="android:singleLine">true</item>
        <item name="android:textSize">16sp</item>
    </style>








                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值