Android系统内部语言切换

由于公司最近项目比较紧,从十一到现在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"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值