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>