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
是否为第一个事件。您的解决方案是正确的,但当我这样做并选择另一项,然后选择第一项时,第一项不起作用