【android基础知识】【国际化及语言选择】

参考源码:http://download.csdn.net/detail/barryhappy/7176709html

将使用support.v7的项目修改了一下,变成了一个不使用actionbaractivity而是activity的。减小报错。java

http://download.csdn.net/detail/mcdullsin/8290923android

 

1、在说多语言的时候首先说说如何减小“hard code”服务器

什么是“hard code”,例如:java文件中直接使用了汉字字符串等。正确作法是将它放在资源文件中,并在须要的地方进行引用。app

说一说如何在java文件等地方使用string.xml中的资源:ide

 

获取string.xml文件里面的值有几个不一样的地方。布局

1.在AndroidManifest.xml与layout等xml文件里:ui

android:text="@string/resource_name" this

  

2.在activity里:spa

方法一:this.getString(R.string.resource_name);  

方法二:getResources().getString(R.string.resource_name); 

 

3.在其余java文件(必须有Context或pplication)

方法一: context.getString(R.string.resource_name); 

方法二: application.getString(R.string.resource_name);  

 

2、接下来分析多语言的源码及如何使用

首先效果截图:

 

这位大哥的博客中很好地说明了android多语言国际化:

http://www.cnblogs.com/bluestorm/archive/2013/04/01/2993554.html

 

 

android的多语言原理是这样:

它会检查android手机的默认配置,而后到具体的values下面去读取字符串。

那位大哥博文中的话:

在Android工程的res目录下,经过定义特殊的文件夹名称就能够实现多语言支持。好比咱们的程序兼容简体中文、英文,在values文件夹中创建默认strings.xml,再创建values-zh-rCN文件夹。

 在每一个文件夹里放置一个strings.xml,strings.xml里是各类语言字符串。若是涉及到参数配置类xml文件夹名称也要改为xml-zh、xml。这样在android的系统中进行语言切换,所开发的程序也会跟着切换语言。

特殊的文件夹名!

说明文件夹名每一个是固定的。

 

那么分析这篇博文中的项目作了什么事情。

它作的事点击menu会弹出语言设置,而后再进行语言的切换。

Java源码以下:

package barry.demo.multilanguage;

import java.util.Locale;

import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Configuration config = getResources().getConfiguration();
        switch (item.getItemId()) {
        case R.id.action_english:
            config.locale = Locale.ENGLISH;
            break;
        case R.id.action_simple_chinses:
            config.locale = Locale.SIMPLIFIED_CHINESE;
            break;
        case R.id.action_traditional_chinese:
            config.locale = Locale.TRADITIONAL_CHINESE;
            break;
        default:
            return true;
        }
        getResources().updateConfiguration(config, getResources().getDisplayMetrics());
        ((TextView)findViewById(R.id.textViewHello)).setText(R.string.hello_world);;
        return true;
    }


}

主布局文件以下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="barry.demo.multilanguage.MainActivity"
    tools:ignore="MergeRootFrame" >

    <TextView
        android:id="@+id/textViewHello"
        android:layout_width="match_parent"
        android:layout_height="218dp"
        android:gravity="center"
        android:text="@string/hello_world" />

</FrameLayout>

菜单布局文件以下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="barry.demo.multilanguage.MainActivity" >

    <item
        android:id="@+id/action_english"
        android:orderInCategory="100"
        android:title="@string/english"/>
    <item
        android:id="@+id/action_simple_chinses"
        android:orderInCategory="100"
        android:title="@string/simple_chinese"/>
    <item
        android:id="@+id/action_traditional_chinese"
        android:orderInCategory="100"
        android:title="@string/traditional_chinese"/>

</menu>

 

 

在这里关键有一个问题就是:

当点击按钮以后,会对文件进行刷新,是每一个字符串textview、listview都要刷新。

getResources().updateConfiguration(config, getResources().getDisplayMetrics());
((TextView)findViewById(R.id.textViewHello)).setText(R.string.hello_world);;

 

若是涉及到服务器就很差刷新了。

并且即便本地文件刷新量也有点大了。

 

因此作法是不能在每一个页面都有语言切换按钮,而应该将语言切换按钮放在登录页。

相关文章
相关标签/搜索