Java 从微调器中选择项目时的无限循环

Java 从微调器中选择项目时的无限循环,java,android,Java,Android,我有一个语言微调器,当选择相应的语言时,使用set.locale可以更改应用程序的语言。但是,当单击微调器中的元素时,我会得到一个无限循环,它会在语言更改后刷新活动。我猜当项目被选中时,它会无限次地读取所选项目。错误是什么?如何解决问题?多谢各位 package com.example.mher.citygo; import android.content.Intent; import android.content.res.Configuration; import android.cont

我有一个语言微调器,当选择相应的语言时,使用
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();
        }
    }
package com.example.mher.citygo;
导入android.content.Intent;
导入android.content.res.Configuration;
导入android.content.res.Resources;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.DisplayMetrics;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.Spinner;
导入java.util.ArrayList;
导入java.util.Locale;
公共类MainActivity扩展了AppCompatActivity{
字符串[]项;
私有静态最终整数请求_CALL=1;
ArrayList列表项;
阵列适配器;
列表视图列表视图;
编辑文本编辑文本;
按钮记录器;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList=新建ArrayList();
添加(新项目数据(“Eng”,R.drawable.usafag));
添加(新项目数据(“Arm”,R.drawable.flag));
添加(新项目数据(“Ru”,R.drawable.russiaflag));
添加(新项目数据(“Per”,R.drawable.iranflag));
微调器sp=(微调器)findViewById(R.id.Spinner);
SpinnerAdapter=新的SpinnerAdapter(this,R.layout.spinner\u layout,R.id.txt,list);
sp.setAdapter(适配器);
sp.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
如果(位置==0)
setLocale(“ru”);
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
最终按钮搜索=(按钮)findViewById(R.id.bSearchRide);
Button LoginDriver=(Button)findViewById(R.id.bLogin_作为_A_驱动程序);
b注册表=(按钮)findViewById(R.id.b注册表);
bregister.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向注册=新意向(MainActivity.this,RegisterActivity.class);
MainActivity.this.startActivity(注册);
}
});
LoginDriver.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent DriverLogin=新的Intent(MainActivity.this、LoginActivity.class);
MainActivity.this.startActivity(DriverLogin);
}
});
searchAnd.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向SearchRide=新意向(MainActivity.this,SearchRide.class);
MainActivity.this.startActivity(SearchRide);
}
});
}
公共void setLocale(字符串lang){
语言环境myLocale=新语言环境(lang);
Resources res=getResources();
DisplayMetrics dm=res.getDisplayMetrics();
Configuration=res.getConfiguration();
conf.locale=myLocale;
res.updateConfiguration(conf,dm);
意图刷新=新意图(此,MainActivity.class);
星触觉(刷新);
完成();
}
}
onItemSelected()
不仅在用户进行选择时被调用。在进行选择时调用它,包括设置默认选择。
微调器始终有一个选择;如果不另行指定,
微调器
将选择适配器中的第一项

在本例中,您通过销毁并重新创建活动来响应
onItemSelected()
,这会触发对
onItemSelected()
的调用,这会销毁并重新创建活动,这会触发对
onItemSelected()
的调用,依此类推


您需要忽略第一个
onItemSelected()
事件,该事件将设置初始选择。第二个事件(如果有)将来自用户。

setOnItemSelectedListener
之前,您可以编写以下行来解决问题

// prevent go to OnItemSelectedListener on create activity, ONLY when user select
sp.setSelection(0,false); 

那么怎么做呢?@KarenMkhitaryan:好吧,你可以使用一个
布尔
字段(例如,
isFirstEvent
),最初设置为
true
。在您的
onItemSelected()
方法中,检查
boolean
是否为第一个事件。您的解决方案是正确的,但当我这样做并选择另一项,然后选择第一项时,第一项不起作用