我有一个语言微调器,当选择相应的语言时,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();
}
}
答案 0 :(得分:1)
onItemSelected()
不仅在用户进行选择时被调用。当任何进行选择时调用它,其中包括设置默认选择。 Spinner
始终有选择;如果您没有另外指定,Spinner
会选择适配器中的第一项。
在您的情况下,您通过销毁并重新创建活动来响应onItemSelected()
,这会触发对onItemSelected()
的调用,该调用会销毁并重新创建活动,从而触发对onItemSelected()
的调用等等。
您需要忽略第一个onItemSelected()
事件,该事件将设置初始选择。第二个事件(如果有的话)将来自用户。
答案 1 :(得分:0)
在setOnItemSelectedListener
之前,您可以写以下行来解决问题
// prevent go to OnItemSelectedListener on create activity, ONLY when user select
sp.setSelection(0,false);