java - Android - 无法将 Spinner 值传递给 jsonSendRequest
问题描述
总的来说,我是 Android 开发和 Java 的新手,所以我想知道是否有人能指出我正确的方向。
我正在编写一个货币转换器应用程序并使用 Volley 请求向 API 发送请求以检索转换率。
现在,我正在将国家/地区硬编码到 URL 中,因为成功检索并显示了转换率。我现在有两个 Spinner,目标是检索所选 Spinner 值的字符串值,然后将这些值用于 json 请求。
我为这两个 Spinner 创建了两个 setOnItemSelectedListener,并将包含字符串值的变量设置为该值。但是,我得到一个空对象引用。
这是我所拥有的:
public class MainActivity extends AppCompatActivity {
RequestQueue rq;
Double conversionDouble;
Spinner toSpinner, fromSpinner;
Spinner toSpinnerText, fromSpinnerText;
private Button convertBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addItemsOnToSpinner();
addListenerOnButton();
jsonSendRequest();
Button convertBtn = (Button) findViewById(R.id.convertBtn);
final EditText fromAmountEditText = findViewById(R.id.fromAmountEditText);
convertBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView toAmountTextView = findViewById(R.id.toAmountTextView);
DecimalFormat percentageFormat = new DecimalFormat("0.00");
Double fromAmount = Double.parseDouble(fromAmountEditText.getText().toString());
String result = "$" + percentageFormat.format(conversionDouble*fromAmount);
toAmountTextView.setText(result);
}
});
rq = Volley.newRequestQueue(this);
}
public void jsonSendRequest() {
RequestQueue queue = Volley.newRequestQueue(this);
// String url = "http://free.currencyconverterapi.com/api/v3/convert?q=CAD_USD&compact=ultra";
String url = "http://free.currencyconverterapi.com/api/v3/convert?q=" + fromSpinnerText + "_" + toSpinnerText + "&compact=ultra";
// Request a string response
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONObject jsonobject = null;
try {
jsonobject = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}
if (jsonobject.has(fromSpinnerText + "_" + toSpinnerText)) {
try {
conversionDouble = jsonobject.getDouble(fromSpinnerText + "_" + toSpinnerText);
// conversionDouble = jsonobject.getDouble(fromSpinnerText + "_" + toSpinnerText);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
}
public void addItemsOnToSpinner(){
Spinner toSpinner = (Spinner) findViewById(R.id.toSpinner);
Spinner fromSpinner = (Spinner) findViewById(R.id.fromSpinner);
List<String> currency = new ArrayList<String>();
currency.add("USD");
currency.add("CAD");
currency.add("CNY");
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, currency
);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
toSpinner.setAdapter(dataAdapter);
fromSpinner.setAdapter(dataAdapter);
fromSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String fromSpinnerText = (String) parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
toSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String toSpinnerText = (String) parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
public void addListenerOnButton() {
Spinner fromSpinner = (Spinner) findViewById(R.id.fromSpinner);
Spinner toSpinner = (Spinner) findViewById(R.id.toSpinner);
Button convertBtn = (Button) findViewById(R.id.convertBtn);
}
}
任何帮助表示赞赏。
解决方案
您已经声明了一些与您的相关的类变量Spinner
:
Spinner toSpinner, fromSpinner;
Spinner toSpinnerText, fromSpinnerText;
您还正确定义onItemSelected()
了setOnItemSelectedListener
.
但是,我假设您打算使类变量Spinner toSpinnerText, fromSpinnerText;
实际上是:
String toSpinnerText = "";
String fromSpinnerText= "";
这样您就可以致电:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
fromSpinnerText = (String) parent.getItemAtPosition(position);
}
请注意,fromSpinnerText
方法中的变量现在使用类变量,而不是您在onItemSelected()
方法中定义的局部变量。
另一个和的onItemSelected()
方法也是如此。Spinner
toSpinnerText
推荐阅读
- javascript - 在没有 ID 或类的 div 周围插入包装器
- javascript - React Native:图像未显示
- delphi - Delphi 7中的Indy 10.6.2 idFTP-接收文件时文件名中的本机符号问题-可能是DefStringEncoding的不良行为
- angular - 路由更改时不打开 Mat 对话框,仅在刷新页面时打开
- powershell - 使用 Graph API 和 PowerShell 将敏感度标签更新为 M365 组会引发 401 错误
- python - 最小化scrapy的代码 - 循环URL
- perl - Yml:无法验证加载合并的 yml 文件
- android - 在 Android 11 中从最近的文件夹中选择 PDF 文件时出现 NulllPointException:Uri
- arrays - 从数组 Bigquery 中提取所有 int64 元素
- powerbi - POWER BI - 如何通过 Connect-live 分析服务数据(相同模式)更改现有数据源,并自动更新报表视觉对象中的字段