Android - невозможно передать значение Spinner в jsonSendRequest - PullRequest
0 голосов
/ 03 июня 2018

Я новичок в разработке для Android и Java в целом, поэтому мне было интересно, может ли кто-нибудь указать мне правильное направление.

Я пишу приложение для конвертации валют и использую запросы Volley для отправкизапрос к API для получения коэффициентов конверсии.

Сейчас я жестко кодирую страны в URL-адресе, который работает, когда коэффициент конверсии успешно извлекается и отображается.У меня есть два Spinner прямо сейчас, и цель состоит в том, чтобы получить строковое значение выбранного значения Spinner и затем использовать эти значения для запроса json.

Я создал два setOnItemSelectedListeners для обоих спиннеров и установил для переменной значение, содержащее значение строки.Однако я получаю нулевую ссылку на объект.

Вот что у меня есть:

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);

    }

}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 03 июня 2018

Вы объявили несколько переменных класса, связанных с вашим 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.

...