当对话框中的Spinner和EditText不为空时,启用按钮

时间:2019-03-14 05:05:42

标签: android android-spinner android-alertdialog android-textwatcher onitemselectedlistener

在我的AlertDialog中,我有一个Spinner和一个EditText。如果

,我试图禁用对话框的肯定按钮
  1. 在微调器上选择的项目是“选择货币”(“选择货币”是数组中的第一项,并且微调器设置为将String currencyName返回为“”)或
  2. EditText为空。

在下面的代码中,如果在Spinner中选择项目之前在EditText中输入了内容,则肯定按钮将保持禁用状态。我不知道如何使这两个一起工作。

任何帮助将不胜感激。谢谢。

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 :(得分:0)

您应该调用微调器的按钮启用/禁用逻辑<html> <head> <style> #hide{ z-index: 10000; position: relative; top: -54px; padding: ; width: 9%; opacity: 0; height: 22px; } #hide:checked~h2{ display: block; } h2{ display: none; } </style> <title></title> </head> <body> <h1>Click me</h1> <input type="checkbox" id="hide" /> <h2>I'll appear when you click h1 !!!</h2> </body> </html> 。截至目前,您只在检查Spinner.onItemSelected中的逻辑。

  1. EditText.onTextChangedAlertDialog上设置侦听器之前,声明您的Spinner
  2. EditText中添加启用或禁用按钮的逻辑。
  3. Spinner.onItemSelected中添加启用或禁用按钮的逻辑。

答案 1 :(得分:0)

请尝试以下代码,仅做一次更改,将其放在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) {

        }
    });
}

答案 2 :(得分:0)

如果您更改代码,则可以使您的代码生效,

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

            }
        });

->这将完成您的工作。