如何实现安卓应用的国际化?

如何利用BaseActivity来实现APP的语言切换?
如何利用BaseActivity来实现APP的语言切换?
如何利用BaseActivity来实现APP的语言切换?

  • 你可以参考下这篇文章:超级BaseActivity的封装
  • 除此之外, 这篇博客: 安卓APP在运行时对全局进行网络状态监听的实现中的 6.默认所有继承 BaseActivity 的页面当网络状况变化活无网络时都会显示提示,所以这里新增BaseActivity 类,注意是类不是活动 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • package com.example.app;
    
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.TextView;
    import android.widget.Toast;
    import androidx.appcompat.app.AppCompatActivity;
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    /**
     * 作者 : WangJinchan
     * 邮箱 : 945750315@qq.com
     * 日期 : 2021/2/25.
     * 说明 :
     */
    public class BaseActivity extends AppCompatActivity {
    
        protected Context mContext;
        protected boolean mCheckNetWork = true; //默认检查网络状态
        View mTipView;
        WindowManager mWindowManager;
        WindowManager.LayoutParams mLayoutParams;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext = this;
            ActivityCollector.addActivity(this);// 将正在创建的活动添加到活动管理器里
            initTipView();//初始化提示View
            EventBus.getDefault().register(this);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            //在无网络情况下打开APP时,系统不会发送网络状况变更的Intent,需要自己手动检查
            hasNetWork(NetUtils.isConnected(mContext));
        }
    
        @Override
        protected void onPause() {
            super.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            ActivityCollector.removeActivity(this);// 将活动管理器里活动移除
            EventBus.getDefault().unregister(this);
        }
    
        @Override
        public void finish() {
            super.finish();
            //当提示View被动态添加后直接关闭页面会导致该View内存溢出,所以需要在finish时移除
            if (mTipView != null && mTipView.getParent() != null) {
                mWindowManager.removeView(mTipView);
            }
        }
    
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onNetworkChangeEvent(NetworkChangeEvent event) {
            hasNetWork(event.isConnected);
        }
    
        private void hasNetWork(boolean has) {
            if (isCheckNetWork()) {
                if (has) {
                    if (mTipView != null && mTipView.getParent() != null) {
                        mWindowManager.removeView(mTipView);
                        Log.e("日志", "有网络");
                        Toast.makeText(mContext,"有网络",Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (mTipView.getParent() == null) {
                       mWindowManager.addView(mTipView, mLayoutParams);
                        Log.e("日志", "无网络");
                        Toast.makeText(mContext,"无网络",Toast.LENGTH_SHORT).show();
    
                        TextView textView=mTipView.findViewById(R.id.text);
                        textView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Intent intent=new Intent(mContext, TipsActivity.class);
                                startActivity(intent);
                            }
                        });
    
                    }
                }
            }
        }
    
        /**
         * 默认所有继承 BaseActivity 的页面当网络状况变化活无网络时都会显示提示,
         * 如果某个页面不需要网络状态提示,可以在该页面 onCreate
         * 方法中调用 setCheckNetWork(false) 即可。
         *
         * @param checkNetWork
         */
        public void setCheckNetWork(boolean checkNetWork) {
            mCheckNetWork = checkNetWork;
        }
    
        public boolean isCheckNetWork() {
            return mCheckNetWork;
        }
    
        private void initTipView() {
            LayoutInflater inflater = getLayoutInflater();
            mTipView = inflater.inflate(R.layout.layout_network_tip, null); //提示View布局
            mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
            mLayoutParams = new WindowManager.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                         //   | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, //注释掉可以进行事件监听
                    PixelFormat.TRANSLUCENT);
            //使用非CENTER时,可以通过设置XY的值来改变View的位置
            mLayoutParams.gravity = Gravity.TOP;
            mLayoutParams.x = 0;
            mLayoutParams.y = 140;
    //        mLayoutParams.gravity = Gravity.CENTER;
    
        }
    }
    
    

为什么要使用BaseActivity来进行语言切换?
as开发中在res目录下创建对应的语言资源文件即可,当系统语言变化,app中会自动切换到相应的资源文件。

正常的做法是在res下创建对应语言的资源文件,不需要你显示切换,app会自动使用对应语言的资源文件。这样你就不能子代码中把字符串写死,而是调用资源文件里的字符串