2017-07-30 4 views
1

私は言語スピナーを持っていて、それぞれの言語を選択すると、set.localeでアプリの言語が変わります。しかし、スピナー内の要素をクリックすると無限ループが発生し、言語変更後のアクティビティが常に最新の状態に更新されます。私は、アイテムが選択されたときに、選択されたアイテムを無制限に読み込むと思います。エラーとは何ですか?問題の解決方法は? ユーザーが選択を行う際にスピナーから項目を選択している間に無限ループ

package com.example.mher.citygo; 

import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.os.Bundle; 
    import android.support.v7.app.AppCompatActivity; 
    import android.util.DisplayMetrics; 
    import android.view.View; 
    import android.widget.AdapterView; 
    import android.widget.ArrayAdapter; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.ListView; 
    import android.widget.Spinner; 

    import java.util.ArrayList; 
    import java.util.Locale; 

    public class MainActivity extends AppCompatActivity { 

     String[] items; 
     private static final int REQUEST_CALL=1; 
     ArrayList<String> listItems; 
     ArrayAdapter<String> adapter; 
     ListView listView; 
     EditText editText; 
     Button bregister; 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      ArrayList<ItemData> list=new ArrayList<>(); 
      list.add(new ItemData("Eng",R.drawable.usaflag)); 
      list.add(new ItemData("Arm",R.drawable.armeniaflag)); 
      list.add(new ItemData("Ru",R.drawable.russiaflag)); 
      list.add(new ItemData("Per",R.drawable.iranflag)); 
      Spinner sp=(Spinner) findViewById(R.id.spinner); 
      SpinnerAdapter adapter=new SpinnerAdapter(this,R.layout.spinner_layout,R.id.txt,list); 
      sp.setAdapter(adapter); 

      sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
        if(position==0) 
         setLocale("ru"); 
       } 

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

       } 
      }); 





      final Button SearchARid=(Button) findViewById(R.id.bSearchRide); 
      Button LoginDriver=(Button) findViewById(R.id.bLogin_As_A_Driver); 
      bregister=(Button) findViewById(R.id.bRegister); 



      bregister.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent SignUp=new Intent(MainActivity.this,RegisterActivity.class); 
        MainActivity.this.startActivity(SignUp); 

       } 
      }); 

      LoginDriver.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent DriverLogin=new Intent(MainActivity.this,LoginActivity.class); 
        MainActivity.this.startActivity(DriverLogin); 
       } 
      }); 

      SearchARid.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent SearchRide=new Intent(MainActivity.this, SearchRide.class); 
        MainActivity.this.startActivity(SearchRide); 
       } 
      }); 
     } 
     public void setLocale(String lang) { 
      Locale myLocale = new Locale(lang); 
      Resources res = getResources(); 
      DisplayMetrics dm = res.getDisplayMetrics(); 
      Configuration conf = res.getConfiguration(); 
      conf.locale = myLocale; 
      res.updateConfiguration(conf, dm); 
      Intent refresh = new Intent(this, MainActivity.class); 
      startActivity(refresh); 
      finish(); 
     } 
    } 

答えて

1

onItemSelected()がないだけと呼ばれて、ありがとうございます。 何かが選択されたときに呼び出されます。デフォルト選択の設定も含まれます。 Spinnerには常に選択があります。特に指定しない場合、Spinnerはアダプタの最初の項目を選択します。あなたのケースでは

、そうでonItemSelected()への呼び出しをトリガー、および活性を破壊し、再作成onItemSelected()への呼び出しを、トリガされ、活性を破壊し、再作成することによってonItemSelected()に応答します。

最初の選択を設定する最初のonItemSelected()イベントを無視する必要があります。 2番目のイベント(存在する場合)はユーザーからのものです。

+0

どうすればいいですか? –

+0

@ KarenMkhitaryan:最初は 'true'に設定された' boolean'フィールド(例えば、 'isFirstEvent')を使うことができます。 'onItemSelected()'メソッドで、 'boolean'をチェックし、それが最初のイベントかどうかを確認してください。 – CommonsWare

+0

あなたのソリューションは正しいですが、そうして別のアイテムを選択してから最初のアイテムを選択すると、最初のアイテムは機能しません –

関連する問題