无法读取在微调器中选择的国家/地区代码 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.OnCountryChangeListener
的 onCountrySelected()
方法被调用时,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
}
我正在开发一个用户必须 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.OnCountryChangeListener
的 onCountrySelected()
方法被调用时,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
}