Search code examples
javaandroidcurrency

How to display the result automatically in EditText?


I am developing an application for converting values ​​from kW to km, I would like to see the score in EditText2 when I entered the value in EditText1 without using any button to do this automatically in the view, but I have no idea how to do this. Right now I must have to select the right value from Spinner to get the result in EditText2. How can this change? Maybe in the wrong way I'm looking for a search value from the Spinner? I will also ask you how to improve the application. Thank you.

I try use TextWeatcher, but still it's not working.

MainActivity.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {


    Spinner spinner1, spinner2;
    EditText editText1, editText2;
    double count = 1.36;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner2 = (Spinner) findViewById(R.id.spinner2);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText2 = (EditText) findViewById(R.id.editText2);

        editText1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after){
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

                String c = s.toString();
                editText2.setText(c);
            }
        });

        ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this, R.array.przelicznik_arrayKM,
                android.R.layout.simple_spinner_item);

        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner1.setAdapter(adapter1);
        spinner1.setOnItemSelectedListener(this);


        ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this, R.array.przelicznik_arraykW,
                android.R.layout.simple_spinner_item);

        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner2.setAdapter(adapter2);

        spinner2.setOnItemSelectedListener(this);

    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        Spinner spinner = (Spinner) parent;
        String text = spinner1.getSelectedItem().toString();

        String text2 = spinner2.getSelectedItem().toString();


        if(text.equals("kW") & text2.equals("KM") ) {

            try {
                double a = Double.parseDouble(editText1.getText().toString());
                double suma = a / count;

                editText2.setText(String.valueOf(suma));

            }catch (NumberFormatException e){
                Toast.makeText(this, "Enter yout value!", Toast.LENGTH_SHORT).show();
            }

        }

        if(text.equals("KM") & text2.equals("kW")){

             try {
                 double a = Double.parseDouble(editText1.getText().toString());
                 double suma = a /count;

                 editText2.setText(String.valueOf(suma));

             }catch (NumberFormatException e){
                 Toast.makeText(this, "Enter your value!", Toast.LENGTH_SHORT).show();
             }
         } else {
            String textString = editText1.getText().toString();
            editText2.setText(String.valueOf(textString));
          }
        }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {}

    public void clearEditText(View view) {

        editText1.setText("");
        editText2.setText("");
    }
}

Strings.xml

    <resources>
    <string name="app_name">PrzelicznikMocySilnika</string>

    <string-array name="przelicznik_arraykW">
        <item>kW</item>
        <item>KM</item>
    </string-array>

    <string-array name="przelicznik_arrayKM">
        <item>KM</item>
        <item>kW</item>
    </string-array>



</resources>

Layout.xmln

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hfad.przelicznikmocysilnika.MainActivity">

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="number"
        android:hint="Enter your value"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toLeftOf="@+id/spinner1"
        android:layout_toStartOf="@+id/spinner1" />

    <EditText
        android:id="@+id/editText2"
        android:hint="Enter your value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/editText1"
        android:ems="10"
        android:inputType="number"
        android:layout_toLeftOf="@+id/spinner2"
        android:layout_toStartOf="@+id/spinner2" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_above="@+id/editText2" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_below="@+id/editText1" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dp"
        android:text="Reset"
        android:textAllCaps="false"
        android:onClick="clearEditText"/>

</RelativeLayout>

Solution

  • For two-way conversion between two EditText views, you have to do conversion only when edittext is on focus. The sample code is below.

    editText1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
                    if (editText1.isFocused()) {
                        String str = editText1.getText().toString().trim();
                        if (!str.isEmpty()) {
                            //your conversion logic here
                            editText2.setText(String.valueOf(convertedValue));
                        }else{
                            etTo.setText("0");
                        }
                    }
                }
            });
    

    Try also similar approach for conversion from editText2 to editText1.