0

簡単なローカリゼーション デモを作成したいです。言語を選択するスピナーと、希望する言語で文字列を表示するテキスト ビューがあります。これが私のコードです。

public class MainActivity extends Activity implements OnItemSelectedListener
{
    Spinner laguageSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        laguageSpinner = laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
        laguageSpinner.setOnItemSelectedListener(this);
        generateLanguageItems();
    }
    public void generateLanguageItems()
    {
        laguageSpinner = laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
        List<String> list = new ArrayList<String>();
        list.add("English");
        list.add("عربي");
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                R.layout.el_spinner_txtview, list);
        dataAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        laguageSpinner.setAdapter(dataAdapter);
    }

    @Override
    public void onItemSelected(AdapterView<?> adapter, View arg1, int pos,
            long arg3)
    {
        Toast.makeText(this, adapter.getItemAtPosition(pos) + "",
                2000).show();
        switch(pos)
        {case 0:    changeLocale( "en" );break;
        case 1:     changeLocale( "ar" );break;}
    }

    public void changeLocale( String code )
    {
        Locale locale = new Locale(code); 
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, 
        getBaseContext().getResources().getDisplayMetrics());
        this.setContentView(R.layout.activity_main);
        generateLanguageItems();
    }
}

ローカリゼーション変更コードは完全に機能します。これを変更してテストしました

    switch(pos)
    {case 0:    changeLocale( "en" );break;
    case 1:     changeLocale( "ar" );break;}

それに

    switch(pos)
    {case 0:    changeLocale( "ar" );break;
    case 1:     changeLocale( "en" );break;}

ここでの私の問題は、実行時にスピナー項目が生成されないことです。空のスピナーがあり、コードにいくつかの変更を加えようとしましたが、うまくいきませんでした。助けてもらえますか?

---EDIT--- 実際のところ、私はこれをやってみました

public void generateLanguageItems()
{
    ....
    laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
    laguageSpinner.setAdapter(dataAdapter);
}

このようにスピナーアイテムは生成されますがonItemSelected()、もうトリガーされません。追加しました

public void generateLanguageItems()
{
            ...
    laguageSpinner.setOnItemSelectedListener(null);
    laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
    laguageSpinner.setAdapter(dataAdapter);
    laguageSpinner.setOnItemSelectedListener(this);
}

今では再帰的にトリガーされ、スピナーをクリックしてアイテムを膨らませることができません!

4

2 に答える 2

0

再帰を中断する条件を追加しました。これが作業コードです

public class MainActivity extends Activity implements OnItemSelectedListener
{
    Spinner laguageSpinner;
    int currentLocale=0;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
        laguageSpinner.setOnItemSelectedListener(this);
        generateLanguageItems(0);
    }
    public void generateLanguageItems(int pos)
    {
        List<String> list = new ArrayList<String>();
        list.add("English");
        list.add("عربي");
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                R.layout.el_spinner_txtview, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        laguageSpinner.setOnItemSelectedListener(null);
        laguageSpinner = ((Spinner) findViewById(R.id.spinner1));
        laguageSpinner.setAdapter(dataAdapter);
        laguageSpinner.setOnItemSelectedListener(this);
        laguageSpinner.setSelection(pos);
        currentLocale = pos;
    }

    @Override
    public void onItemSelected(AdapterView<?> adapter, View arg1, int pos, long arg3)
    {   changeLocale(  pos );   }

    @Override
    public void onNothingSelected(AdapterView<?> arg0)
    {   }

    public void changeLocale( int pos )
    {
        if ( currentLocale == pos)
            return;
        Locale locale;
        if (pos == 0)
            locale = new Locale("en");
        else
            locale = new Locale("ar");
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, 
                getBaseContext().getResources().getDisplayMetrics());
        this.setContentView(R.layout.activity_main);
        generateLanguageItems(pos);
    }
}
于 2013-10-06T09:05:02.513 に答える
0

なぜこの二重の割り当てがあるのですか:

laguageSpinner = laguageSpinner = ((Spinner) findViewById(R.id.spinner1));

それをに変更します

laguageSpinner = (Spinner) findViewById(R.id.spinner1);

そしてさらに試みる。

于 2013-10-06T07:41:15.380 に答える