Truthwillcome 35
Truthwillcome 35

Reputation: 101

Activate BUTTON_POSITIVE of AlertDialog only when an item is checked

I am making an AlertDialog of multi choice items, get the checked items when the users press "ok". The items will be displayed on TextView.

My problem is that I want to activate the "ok" BUTTON_POSITIVE of the AlertDialog only when at least one item is selected. My full code and how I think to solve this..

public class MainActivity extends AppCompatActivity {

    Button mORder;
    TextView mItemSelected;
    String[] listItems;
    boolean[]checkedItems;
    ArrayList<Integer> mUserItems= new ArrayList<>();

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

        mORder=findViewById(R.id.btnOrder);
        mItemSelected=findViewById(R.id.selectedItems);

        listItems=getResources().getStringArray(R.array.shopping_items);
        checkedItems=new boolean[listItems.length];
        mORder.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                final AlertDialog.Builder mBuilder= new AlertDialog.Builder(MainActivity.this);
                mBuilder.setTitle("Practice language");
                mBuilder.setMultiChoiceItems(listItems, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int position, boolean ischecked) {
                        if(ischecked){
                            mUserItems.add(position);
                        }
                        else {
                            mUserItems.remove(Integer.valueOf(position));
                        }
                    }
                });
                mBuilder.setCancelable(false);
                mBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int position) {
                        String item="";
                        for(int i=0 ;i<mUserItems.size();i++){
                            item= item + listItems[mUserItems.get(i)];
                            if (i != mUserItems.size()-1){
                                item=item+ ", ";
                            }
                        }
                        mItemSelected.setText(item);
                    }
                });
                final AlertDialog dialog =mBuilder.create();
                dialog.show();
                Log.i("userList ",""+mUserItems.size());
                if((mUserItems.size()==0)){   
                   ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
                 }
                 else {                 
                    ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
                 }
               }
           });
        }
    }

Upvotes: 1

Views: 92

Answers (1)

B&#246; macht Blau
B&#246; macht Blau

Reputation: 13019

Let your MainActivity have a field for the AlertDialog:

private AlertDialog dialog;

Assign the created AlertDialog:

// ... at the end of onCreate()...
dialog = builder.create();
dialog.show();
Log.i("userList ",""+mUserItems.size());
togglePositiveButtonEnabled();

The new method togglePositiveButtonEnabled() checks if mUserList is empty and enables/disables the OK Button of the dialog:

void togglePositiveButtonEnabled(){
    if(dialog == null) return;
    if((mUserItems.size()==0)){
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
    }
    else{
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
    }
}

This method can also be called from inside the OnMultiChoiceClickListener:

@Override
public void onClick(DialogInterface dialogInterface, int position, boolean ischecked){
    if(ischecked){
        mUserItems.add(position);
    } 
    else {
        mUserItems.remove(Integer.valueOf(position));
    }
    togglePositiveButtonEnabled();
}

Upvotes: 1

Related Questions