android 프로그램 내 다중 언어 전환 다시 시작할 필요가 없는 해결 방안

14209 단어 android
android 프로그램 내의 다중 언어 전환에 관해서는 일반적으로 이 코드를 검색할 수 있습니다.
    public void switchLanguage(Locale locale) {
                 Configuration config = getResources().getConfiguration();//       
                 Resources resources = getResources();//   res    
                 DisplayMetrics dm = resources.getDisplayMetrics();//       :      ,   。
                 config.locale = locale; //  
                 resources.updateConfiguration(config, dm);
         }

대부분의 방안은activity를 다시 시작하거나 setContentView를 다시 시작하는 것이다. 그러나 위챗은 다시 시작하지 않고 언어를 수정할 수 있다. 어떻게 하지?비열한 사람들로 하여금 사고방식을 실현하도록 하자. 먼저 다중 언어 전환 지원의 사용자 정의 컨트롤러를 정의하고 전체 app가 다중 언어의 레이아웃과 관련된 곳에서 사용해야 한다. 컨트롤러를 초기화할 때string자원 id를 얻고string자원 id를 저장하며settext할 때string자원 id를 업데이트하고 언어를 전환할 때 위에서 제공한 코드를 사용한다.언어를 설정한 후(중국어로 설정한 경우) string자원 id를 통해 text를 다시 설정하면 중국어 문자가 표시됩니다. 만약에 우리가 자발적으로 업데이트를 하지 않으면 그들은 자신도 모르게 여동생처럼 자발적으로 손에 넣을 수 있기 때문에 우리는 모든 다중 언어가 지원하는 사용자 정의 컨트롤을 업데이트해야 합니다.방법은 모든 activity에 메시지를 보내고 activity가 받은 후에 자신의view를 꺼내서 모든 하위 view를 한 번 열거하는 것이다. 다중 언어가 지원하는 사용자 정의 컨트롤러라면 업데이트하고 자세한 절차는 다음 문장을 보십시오.
단계 1:
다국어 폴더를 만들고 많은 언어에 필요한 텍스트를 작성합니다
values-zh
values-en
…..
자세히 말하지 않겠다
단계2:
다중 언어 전환 인터페이스를 정의하려면 사용자 정의view가 필요합니다
컨트롤 패키지(widget 패키지)에서 AppTextView 및 AppButton 만들기
인터페이스 설정: LanguageView
    //  setText     ,             ,    app        textview   (  xml     ),         
    void setTextById (@StringRes int id);//    textId
    void setTextWithString (String text);//    textId,                
    void setTextByArrayAndIndex (@ArrayRes int arrId, @StringRes int arrIndex);//    TextArray    

    void reLoadLanguage();//            

3단계:
사용자 정의 다국어 전환view:
public class AppTextView extends TextView implements LanguageView {
    private int textId ;//  id
    private int hintId ;//hint id
    private int arrResId,arrResIndex;

    public AppTextView(Context context) {
        super(context);
        init(context, null);
    }

    public AppTextView(Context paramContext, AttributeSet paramAttributeSet) {
        super(paramContext, paramAttributeSet);
        init(paramContext, paramAttributeSet);
    }

    public AppTextView(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
        super(paramContext, paramAttributeSet, paramInt);
        init(paramContext, paramAttributeSet);
    }

    /**
     *      xml   id
     * @param context
     * @param attributeSet
     */
    private void init (Context context,AttributeSet attributeSet) {
        if (attributeSet!=null) {
            String textValue = attributeSet.getAttributeValue(ANDROIDXML, "text");
            if (!(textValue==null || textValue.length()<2)) {
                //    android:text="@string/testText"
                //textValue     @156878785,  @     id
                textId = StringUtil.string2int(textValue.substring(1,textValue.length()));
            }

            String hintValue = attributeSet.getAttributeValue(ANDROIDXML, "hint");
            if (!(hintValue==null || hintValue.length()<2)) {
                hintId = StringUtil.string2int(hintValue.substring(1,hintValue.length()));
            }
        }
    }

    @Override
    public void setTextById (@StringRes int strId) {
        this.textId = strId;
        setText(strId);
    }

    @Override
    public void setTextWithString(String text) {
        this.textId = 0;
        setText(text);
    }
    @Override
    public void setTextByArrayAndIndex (@ArrayRes int arrId, @StringRes int arrIndex) {
        arrResId = arrId;
        arrResIndex = arrIndex;
        String[] strs = getContext().getResources().getStringArray(arrId);
        setText(strs[arrIndex]);
    }

    @Override
    public void reLoadLanguage () {
        try {
            if (textId>0) {
                setText(textId);
            } else if (arrResId>0) {
                String[] strs = getContext().getResources().getStringArray(arrResId);
                setText(strs[arrResIndex]);
            }

            if (hintId>0) {
                setHint(hintId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4단계:
블로그 출처 작성 xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"

    android:layout_height="match_parent">

    <cn.georgeyang.languageupdate.widget.AppTextView
        android:text="@string/testText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <cn.georgeyang.languageupdate.widget.AppButton
        android:id="@+id/btn"
        android:text="@string/next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

LinearLayout>

단계 5:
activity 코드를 작성한 후 이벤트bus를 추가하여activity 간의 통신을 실현합니다(다른 방식으로 통신을 실현해도 됩니다)
gradle      compile 'org.greenrobot:eventbus:3.0.0'


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);


        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 switchLanguage(Locale.CHINESE);
                 ClassEvent event = new ClassEvent();
                 event.msg = "do it";
                 EventBus.getDefault().post(event);
            }
        });
    }

 public void switchLanguage(Locale locale) {
        Configuration config = getResources().getConfiguration();//       
        Resources resources = getResources();//   res    
        DisplayMetrics dm = resources.getDisplayMetrics();//       :      ,   。
        config.locale = locale; 
        resources.updateConfiguration(config, dm);
    }

    @Subscribe(threadMode = ThreadMode.MAIN) // ui    
    public void onStringEvent(ClassEvent event) {
        Log.d("test","MainActivity got message:" +  event);
        //start update language
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        EventBus.getDefault().unregister(this);//   EventBus
    }
}

단계 6
다국어 문자를 수정하는 코드를 작성하려면 다음과 같이 하십시오.
    //     view,  view      ,     LanguageView   view,    
    public static void updateViewLanguage(View view) {
        if (view instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) view;
            int count = vg.getChildCount();
            for (int i = 0; i < count; i++) {
                updateViewLanguage(vg.getChildAt(i));
            }
        } else if (view instanceof LanguageView) {
            LanguageView tv = (LanguageView) view;
            tv.reLoadLanguage();
        }
    }

다국어 문자의 코드를 수정한 후 호출을 시작합니다.
    @Subscribe(threadMode = ThreadMode.MAIN) // ui    
    public void onStringEvent(ClassEvent event) {
        Log.d("test","MainActivity got message:" +  event);
        ViewUtil.updateViewLanguage(findViewById(android.R.id.content));
    }

마지막으로 버튼을 누르면 언어를 업데이트할 수 있습니다.activity가 다시 시작되지 않았고 지난번 activity의 언어도 따라서 바뀌었습니다.textview를 찾아서 수동으로 수정할 필요가 없습니다. 편리하죠?!
마지막으로 데모 코드를 보여 줍니다.
gitDemo

좋은 웹페이지 즐겨찾기