android 프로그램 내 다중 언어 전환 다시 시작할 필요가 없는 해결 방안
14209 단어 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.