Кнопка включения, когда Spinner и EditText не пусты в диалоге - PullRequest
0 голосов
/ 14 марта 2019

В моем AlertDialog у меня есть Spinner и EditText. Я пытаюсь отключить положительную кнопку диалога, если

  1. выбранный элемент в Spinner - «Выбрать валюту» («Выбрать валюту» - первый элемент в моем массиве, и Spinner настроен на возврат String currencyName как «») или
  2. EditText пуст.

В приведенном ниже коде, если у меня есть ввод в EditText до выбора элемента в Spinner, положительная кнопка остается отключенной. Я понятия не имею, как заставить этих двух работать вместе.

Любая помощь будет высоко ценится. Спасибо.

private void openDialog(){
    LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    View subView = inflater.inflate(R.layout.dialog_layout, null);
    final EditText subEditTextExchangeRate = subView.findViewById(R.id.textInputExchangeRate);
    final Spinner subSpinner = subView.findViewById(R.id.spinner);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.currency, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    subSpinner.setAdapter(adapter);
    subSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(parent.getItemAtPosition(position).equals("Select currency")){
                currencyName = "";

            }else {
                currencyName = parent.getItemAtPosition(position).toString();
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(subView);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            exchangeRate = subEditTextExchangeRate.getText().toString();
            st2 = exchangeRate;
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });


    final AlertDialog alertDialog = builder.create();
    alertDialog.show();

    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
    subEditTextExchangeRate.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) {
            String exchangeRateInput = subEditTextExchangeRate.getText().toString();
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(!exchangeRateInput.isEmpty() && !currencyName.isEmpty()); 
        }//This is the logic that I am looking for but the method is watching only EditText

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Пожалуйста, попробуйте ниже код только с одним изменением, поместите ниже строку в subSpinner.setOnItemSelectedListener, а также, пожалуйста, объявите alertDialog глобально.

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(!exchangeRateInput.isEmpty() && !currencyName.isEmpty());

Вот ваш код.

private void openDialog(){
    LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    View subView = inflater.inflate(R.layout.dialog_layout, null);
    final EditText subEditTextExchangeRate = subView.findViewById(R.id.textInputExchangeRate);
    final Spinner subSpinner = subView.findViewById(R.id.spinner);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.currency, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    subSpinner.setAdapter(adapter);
    subSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(parent.getItemAtPosition(position).equals("Select currency")){
                currencyName = "";

            }else {
                currencyName = parent.getItemAtPosition(position).toString();
            }
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(!exchangeRateInput.isEmpty() && !currencyName.isEmpty()); 
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(subView);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            exchangeRate = subEditTextExchangeRate.getText().toString();
            st2 = exchangeRate;
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });


    alertDialog = builder.create();
    alertDialog.show();

    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
    subEditTextExchangeRate.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) {
            String exchangeRateInput = subEditTextExchangeRate.getText().toString();
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(!exchangeRateInput.isEmpty() && !currencyName.isEmpty()); 
        }//This is the logic that I am looking for but the method is watching only EditText

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}
0 голосов
/ 14 марта 2019

вы можете заставить свой код работать, если вы измените свой код как,

    Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
    button.setEnabled(false);
        subEditTextExchangeRate.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) {
            if(s.length>0 && !TextUtils.isEmpty(currencyName )){
            button.setEnabled(true);
            // your logic
           }else{
            button.setEnabled(false);
            // your logic
            }


            @Override
            public void afterTextChanged(Editable s) {

            }
        });

-> это сделает вашу работу.

0 голосов
/ 14 марта 2019

Вы должны вызвать кнопку включения / выключения логики Spinner.onItemSelected вашего счетчика.На данный момент вы проверяете только логику в EditText.onTextChanged.

  1. Объявите AlertDialog перед настройкой слушателя на Spinner и EditText.
  2. В Spinner.onItemSelectedдобавьте свою логику, чтобы включить или отключить кнопку.
  3. В EditText.onTextChanged добавьте свою логику, чтобы включить или отключить кнопку.
...