【发布时间】:2016-03-16 17:15:16
【问题描述】:
1) 在我的活动中,我有两个微调器:countrySpinner、citySpinner。第二个微调器取决于第一个 - 如果用户从 countrySpinner 中选择项目 A,则第二个 citySpinner 中的值也会更新,例如如果用户从第一个中选择俄罗斯,则在第二个微调器中,他将获得俄罗斯城市...
2) 在我的活动中,我有一个按钮,用于保存用户在微调器中提供的信息。信息存储在共享应用首选项中。我没有在代码示例中包含它,因为它不相关。
3.在活动的 onCreate 方法中,我读取了以前保存的值 -> checkIfLocalSettingExists()) 并将保存的值分配给“countryStr”和“cityStr”变量。
4.然后我想更新一开始有默认值的微调器。我有存储在共享首选项中的字符串,因此为了获得正确的元素,我使用了 getIndex 函数,它返回我应该设置的元素的 id。
5.在我得到需要在两个微调器上设置的元素后,我可以设置它们。我将检索到的 id 分配给微调器,但是 setOnItemSelectedListener 执行了两次不知道为什么,可能是它不起作用的原因!。
代码:
public class Settings extends ActionBarActivity{
public Spinner countrySpinner;
public Spinner citySpinner;
public String cityStr;
public String countryStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_settings);
countrySpinner = (Spinner) findViewById(R.id.kraje_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.Countries, R.layout.spinner_layout);
countrySpinner.setAdapter(adapter);
citySpinner = (Spinner) findViewById(R.id.przejscie_spinner);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this, R.array.CitiesRussia, R.layout.spinner_layout);
citySpinner.setAdapter(adapter2);
if (checkIfLocalSettingExists())
{
System.out.println("Gathered following values from settings");
System.out.println("Country: " + countryStr);
System.out.println("City: " + cityStr);
System.out.println("----");
System.out.println("Setting the spinners...");
System.out.println("Country spinner:");
// I found the ID of saved country, I can set it in countrySpinner
countrySpinner.setSelection(getIndex(countrySpinner, countryStr));
System.out.println("City spinner:");
//without this it didn't work at all, don't know why
if (kraj.toLowerCase().equals("russia"))
adapter2 = ArrayAdapter.createFromResource(this, R.array.CitiesRussia, R.layout.spinner_layout);
else if (kraj.toLowerCase().equals("ukraine"))
adapter2 = ArrayAdapter.createFromResource(this, R.array.CitiesUkraine, R.layout.spinner_layout);
else {
adapter2 = ArrayAdapter.createFromResource(this, R.array.CitiesBelarus, R.layout.spinner_layout);
}
citySpinner.setAdapter(adapter2);
// I found the ID of saved city, I can set it in citySpinner
citySpinner.setSelection(getIndex(citySpinner, cityStr));
}
countrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
if (position == 0) {
System.out.println("SELECTED RUSSIA");
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(Settings.this,
R.array.CitiesRussia, R.layout.spinner_layout);
adapter2.setDropDownViewResource(R.layout.spinner_layout);
citySpinner.setAdapter(adapter2);
}
//
else if (position == 1) {
System.out.println("SELECTED UKRAINE");
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(Settings.this,
R.array.CitiesUkraine, R.layout.spinner_layout);
adapter2.setDropDownViewResource(R.layout.spinner_layout);
citySpinner.setAdapter(adapter2);
} else {
System.out.println("SELECTED BELARUS");
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(Settings.this,
R.array.CitiesRussia, R.layout.spinner_layout);
adapter2.setDropDownViewResource(R.layout.spinner_layout);
citySpinner.setAdapter(adapter2);
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
private int getIndex(Spinner spin, String myString){
int index = 0;
String tmp = "";
System.out.println("Im in get index function!");
System.out.println("Seraching for: " + myString);
for (int i=0;i<spin.getCount();i++){
tmp = spin.getItemAtPosition(i).toString();
System.out.println("checking if " + tmp.toLowerCase() + " equals " + myString.toLowerCase());
if (tmp.toLowerCase().equals(myString.toLowerCase())){
System.out.println("FOUND IT --> " +tmp + " ---->" + i +", its: " + myString);
index = i;
break;
}
else
System.out.println("NOT FOUND IT --> " +tmp + "-->" + i +", its NOT: " + myString);
}
return index;
}
代码输出:
03-16 15:51:12.590 I/System.out: Gathered following values from settings
03-16 15:51:12.590 I/System.out: Country: Belarus
03-16 15:51:12.590 I/System.out: City: Terespol
03-16 15:51:12.590 I/System.out: ----
03-16 15:51:12.590 I/System.out: Setting the spinners...
03-16 15:51:12.590 I/System.out: Country spinner:
03-16 15:51:12.590 I/System.out: Im in get index function!
03-16 15:51:12.590 I/System.out: Seraching for: Belarus
03-16 15:51:12.590 I/System.out: checking if russia equals belarus
03-16 15:51:12.590 I/System.out: NOT FOUND IT --> russia -->0, its NOT: Belarus
03-16 15:51:12.590 I/System.out: checking if ukraine equals belarus
03-16 15:51:12.590 I/System.out: NOT FOUND IT --> ukraine-->1, its NOT: Belarus
03-16 15:51:12.590 I/System.out: checking if belarus equals belarus
03-16 15:51:12.590 I/System.out: FOUND IT --> Belarus ---->2, its: Belarus
03-16 15:51:12.590 I/System.out: City spinner:
03-16 15:51:12.590 I/System.out: Im in get index function!
03-16 15:51:12.590 I/System.out: Seraching for: Terespol
03-16 15:51:12.590 I/System.out: checking if cityA equals terespol
03-16 15:51:12.590 I/System.out: NOT FOUND IT --> cityA -->0, its NOT: Terespol
03-16 15:51:12.590 I/System.out: checking if cityB equals terespol
03-16 15:51:12.590 I/System.out: NOT FOUND IT --> cityB -->1, its NOT: Terespol
03-16 15:51:12.590 I/System.out: checking if cityC equals terespol
03-16 15:51:12.594 I/System.out: NOT FOUND IT --> cityC -->2, its NOT: Terespol
03-16 15:51:12.594 I/System.out: checking if cityD equals terespol
03-16 15:51:12.594 I/System.out: NOT FOUND IT --> cityD -->3, its NOT: Terespol
03-16 15:51:12.594 I/System.out: checking if cityE equals terespol
03-16 15:51:12.594 I/System.out: NOT FOUND IT --> cityE -->4, its NOT: Terespol
03-16 15:51:12.594 I/System.out: checking if terespol equals terespol
03-16 15:51:12.594 I/System.out: FOUND IT --> Terespol ---->5, its: Terespol
03-16 15:51:12.594 I/System.out: 5
03-16 15:51:12.642 I/System.out: SELECTED BELARUS
所以白俄罗斯的代码是 2,它由 getIndex 函数正确返回,然后将 spinner 设置为有效值(BELARUS)。 Terespol 的返回码是 5,它由 getIndex 函数正确返回,然后由于 setOnItemSelectedListener 再次为 countrySpinner 执行而未正确设置微调器..(检查输出的最后一行)。为什么?我只为 countrySpinner 设置了侦听器,而不为 citySpinner 设置了侦听器?!结果 citySpinner 被设置为第 1 个而不是第 5 个元素。为什么在世界上它不起作用!?
【问题讨论】:
标签: android spinner android-spinner