无法读取在微调器中选择的国家/地区代码 Android

Cannot read country code selected in a spinner Android

我正在开发一个用户必须 select 国家代码的应用程序,我成功地为上述目的创建了一个微调器,如图 link:
Creating a spinner for choosing country code 但是我在读取微调器中的值 selected 时遇到问题。

{
               String abc = onCountryPickerClick();//abc is always null 
}  
    public String onCountryPickerClick (){
         ccp.setOnCountryChangeListener(new CountryCodePicker.OnCountryChangeListener() {
             @Override
             public void onCountrySelected() {
                 selected_country_code = ccp.getSelectedCountryCodeWithPlus();
             }

         });
         return  selected_country_code;
    }

回调不同步。不幸的是,您不能简单地执行 String abc = onCountryPickerClick();,因为您正在 returning 是尚未设置的东西。让我们检查一下您的代码:

ccp.setOnCountryChangeListener(
     new CountryCodePicker.OnCountryChangeListener() {
         @Override
         public void onCountrySelected() {
             selected_country_code = ccp.getSelectedCountryCodeWithPlus();
         }
     });

代码似乎是说当在微调器中选择国家/地区时,您分配 selected_country_code 的值。假设这是由用户触发的操作,当您调用 String abc = onCountryPickerClick(); 时,您如何确定用户选择了任何内容?这就是问题所在。您无法确定用户是否已经选择了该选项,并且 return输入该值是不够的。

您可以通过多种方式解决此问题。例如,您可以继续传播回调:

public void onCountryPickerClick(OnCountryChangeListener listener){
     ccp.setOnCountryChangeListener(listener);
}

// Anywhere you call this
onCountryPickerClick(new CountryCodePicker.OnCountryChangeListener() {
         @Override
         public void onCountrySelected() {
             // Here do whatever you want with the selected country
         }
     });

上述方法与您现在的方法没有太大区别。还有其他选择。您可以使用 java observables 即:

class CountryCodeObservable extends Observable {
  private String value;

  public CountryCodeObservable(String value) {
    this.value = value;
  }

  public void setCountryCode(String countryCode) {
    value = countryCode;
    setChanged();
    notifyObservers(value);
  }
}

public CountryCodeObservable onCountryPickerClick(){
  CountryCodeObservable retValue = new CountryCodeObservable("");

  ccp.setOnCountryChangeListener(
     new CountryCodePicker.OnCountryChangeListener() {
         @Override
         public void onCountrySelected() {
             retValue.setCountryCode(ccp.getSelectedCountryCodeWithPlus());
         }
     });

  return retValue;
}

// Then when calling this method you can do something like:
CountryCodeObservable observable = onCountryPickerClick();

observable.addObserver((obj, arg) -> {
   // arg is the value that changed. You'll probably need to cast it to
   // a string
});

以上示例允许您添加多个可观察对象。对于您的用例来说可能太多了,我只是认为它说明了另一种方法以及这种情况的异步性。

同样,还有更多方法可以解决这个问题,关键是您不能简单地 return 一个字符串并希望它在用户选择任何内容时发生变化。

String abc = onCountryPickerClick(); 被调用时,selected_country_code 值将被分配给 abc

当您的 CountryCodePicker.OnCountryChangeListeneronCountrySelected() 方法被调用时,ccp.getSelectedCountryCodeWithPlus(); 的值被分配给 selected_country_code。由于 String 是不可变的,因此更改 selected_country_code 的值不会更改 abc 的值,也不会调用 return selected_country_code;

可能的解决方案之一是更改您的 CountryCodePicker.OnCountryChangeListener 匿名实施,以将选定的国家/地区值分配给 abc,例如

@Override
public void onCountrySelected() {
       selected_country_code = ccp.getSelectedCountryCodeWithPlus();
       abc = selected_country_code
}