由于公司最近项目比较紧,从十一到现在3个多月的时间里面要完成两个项目,所以导致好久没有写blog了,现在整理一下最近做的相关功能,
由于公司是总公司在澳门,所以做应用就要兼容繁体语言,而产品又看到了微信,支付宝有APP内切换语言的功能,所以呢,我们就要实现,其实这真的是个没有意义的需求,但是有没有意义不是程序员能说的算的,正所谓你发薪水,你提需求,我拿工资,我来实现,好吧,废话不多说了,直接上代码了。
首先写一个BaseActivity,让后面所有的Activity都继承这个BaseActivity,在BaseActivity的onCreate中执行切换语言操作,那么在setContentView之后程序就会直接执行切换语言的操作。
BaseActivity.java
public abstract class BaseActivity extends Activity implements Serializable {
ImageView leftImage, rightImage;
public TextView leftText, title, rightText;
public Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
LanguageHelper.chooseLanguage(getApplicationContext());
context = getApplicationContext();
super.onCreate(savedInstanceState);
getData(savedInstanceState);
showView();
}
public void getData(Bundle bundle) {
getChildData();
CloseActivityHelper.activityList.add((Activity) bundle.get("activity"));
CloseActivityHelper.activityBaseList.add((Activity) bundle.get("activity"));
initView((int) bundle.get("layout"), (int) bundle.get("leftImage"), (String) bundle.get("leftText"),
(String) bundle.get("title"), (String) bundle.get("rightText"), (int) bundle.get("rightImage"));
}
@Override
protected void onResume() {
super.onResume();
}
protected void initView(int layout, int leftIcon, String leftString, String titleString, String rightString, int rightIcon) {
setContentView(layout);
leftImage = (ImageView) findViewById(R.id.leftImage);
leftText = (TextView) findViewById(R.id.leftText);
title = (TextView) findViewById(R.id.title);
rightText = (TextView) findViewById(R.id.rightText);
rightImage = (ImageView) findViewById(R.id.rightImage);
if (leftImage != null) {
if (leftIcon != 0) {
leftImage.setBackgroundResource(leftIcon);
} else {
leftImage.setBackgroundResource(R.drawable.icon_status_back);
}
}
if (leftText != null) {
leftText.setText(leftString);
}
if (title != null) {
title.setText(titleString);
}
if (rightText != null) {
rightText.setText(rightString);
}
if (rightImage != null) {
if (leftIcon != 0) {
rightImage.setVisibility(View.VISIBLE);
rightImage.setBackgroundResource(rightIcon);
}
}
initChildView();
}
public abstract void getChildData();
public abstract void initChildView();
public void onLeftClick(View view) {
finish();
}
public abstract void showView();
@Override
public void onStop() {
super.onStop();
}
}
代码不是很复杂,还是从onCreate中开始第一句就是切换语言LanguageHelper.chooseLanguage(getApplicationContext());
LanguageHelper.java
public class LanguageHelper {
public static void chooseLanguage(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String language = sharedPreferences.getString("language", "");
Resources resource = context.getResources();
Configuration config = resource.getConfiguration();
if (!"".equals(language)) {
config.locale.setDefault(new Locale(language));
}
context.getResources().updateConfiguration(config, null);
}
}
就一个方法,从config这个sp中拿到保存的语言类型,让后更新Resource下的config.locale的属性就完成了。
BaseActivity中还涉及到几个快速实现功能方法,添加统一的title,我的title包含左边文字图片,标题内容,右边图片文字。
base_title.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/color_0b6">
<ImageView
android:id="@+id/leftImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:onClick="onLeftClick" />
<TextView
android:id="@+id/leftText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/leftImage"
android:layout_centerInParent="true" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="19sp"
android:layout_centerInParent="true" />
<ImageView
android:id="@+id/rightImage"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:onClick="onRightClick"
android:visibility="gone" />
<TextView
android:id="@+id/rightText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/rightImage"
android:layout_centerInParent="true" />
</RelativeLayout>
CloseActivityHelper.activityList.add((Activity) bundle.get(“activity”));
CloseActivityHelper.activityBaseList.add((Activity) bundle.get(“activity”));
这两个主要是为了在特定场合下关闭所有的activity,因为在语言切换之后需要关闭页面然后重新打开才会生效,所以设计了关闭所有Activity的功能
CloseActivityHelper.java
public static List<Activity> activityList = new ArrayList<>();
public static List<Activity> activityBaseList = new ArrayList<>();
public static void closeActivity(Context ctx, boolean base) {
for (Activity activity : base ? activityBaseList : activityList) {
if (null != activity) {
activity.finish();
}
}
ActivityManager activityMgr = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.restartPackage(ctx.getPackageName());
}
每个集成BaseActivity的页面在onCreate中只要添加这句话就可以了
super.onCreate(DataHelper.getBundle(savedInstanceState, R.layout.activity_home, 0, "", "Home", "", 0, this));
在xml中添加
<include layout="@layout/base_title"/>