【问题标题】:Android: spinners & setOnItemSelectedListener & getSharedPreferencesStringAndroid:微调器和 setOnItemSelectedListener 和 getSharedPreferencesString
【发布时间】:2016-03-16 17:15:16
【问题描述】:

1) 在我的活动中,我有两个微调器:countrySpinnercitySpinner。第二个微调器取决于第一个 - 如果用户从 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


    【解决方案1】:

    每当您从微调器中手动选择任何项目或像这样调用setSelection() 时-

    countrySpinner.setSelection(getIndex(countrySpinner, countryStr));
    

    它肯定会调用onItemSelected() 并且在onItemSelected() 中,您正在加载您的城市微调器值,尽管您之前选择了特定项目,但它会重置您的选择。

    要解决此问题,您必须跟踪您是否已从 checkIfLocalSettingExists() 加载国家微调器值,在这种情况下,您不必在 onItemSelected() 中设置城市微调器适配器,因为您是已经这样做了。

    【讨论】:

    • 您好,感谢您的回复。好主意,但我该怎么做呢?
    • 您可以创建一个布尔标志并在调用 setSelection() 之前将其设置为 true。检查 onItemSelected() 中的标志。如果该标志为真,则为城市微调器设置适配器,否则不要这样做。
    • 您写道:“您正在加载您的城市微调器值,尽管您之前选择了特定项目,但它会重置您的选择。”是的,没错。首先,我正在读取 countrySpinner 值并将它们分配给这个微调器,然后 citySpinner 值也会更新。后来我检查了为 citySpinner 存储的值,并且我也在尝试分配该值。我不明白的是,听众只为 countrySpinner 而不是 citySpinner 设置的事实!如果我在行中更改 citySpinner 的值,为什么执行 countrySpinner.onItemSelected():
    • countrySpinner.onItemSelected() 被执行,因为您在 country spinner 上调用 setSelection() 。这不是因为城市旋转。
    • 首先我设置 countrySpinner: countrySpinner.setSelection(getIndex(countrySpinner, countryStr)) countrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() ?
    【解决方案2】:

    我设法通过设置额外的侦听器来做到这一点,在该侦听器中我将 allowModification 标志设置为 true。仍然不知道为什么以前它不起作用以及为什么最后总是执行侦听器(错误?)

     citySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
                allowModification = true;
    
            }
    
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
    
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多