Search code examples
androidandroid-dialogfragmentandroid-dialog

Why doesn't progress spinner work after closing alert dialog in android?


My progress bar is just a spinner.

I am showing two options to user and when user clicks an option, I show a dialog, so that user reads and understands it.

This is what I want. When they click positive, it should show the spinner and keep calling service on background. When they click negative, it should make the option unchecked.

Here is the code.

This radioGroup.setOnClickListener goes into onCreateView method of a fragment.

    public class Choose_CountryFragment extends Fragment {
        private RadioGroup radioGroup;
        private TextView textView;
        private String countryChosen = null;
        ConnectionStatus connectionStatus = new ConnectionStatus(getContext());
        public Choose_CountryFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 final Bundle savedInstanceState) {
            View rootView =  inflater.inflate(R.layout.fragment_choose__country, container, false);

          radioGroup = (RadioGroup) rootView.findViewById(R.id.country_choice_radio);
         radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
                {
                    public void onCheckedChanged(RadioGroup group, int checkedId) {
                        switch(checkedId){
                            case R.id.countryCanada:
                                // do operations specific to this selection
                                countryChosen = "Canada";
                                Intent explicitServiceIntent = new Intent(getActivity(), Service.class);
                                explicitServiceIntent.putExtra("country", "Canada");
                                getActivity().startService(explicitServiceIntent);
                                connectionStatus.showProgress();
                                break;
                            case R.id.countryUSA:
                                countryChosen = "USA";
                                Dialog dialog = onCreateDialog(savedInstanceState);
                                dialog.show();
                                connectionStatus.showProgress();
                                break;
                        }
                    }
                });

        public Dialog onCreateDialog(final Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            Toast.makeText(getContext(), "Click Got it", Toast.LENGTH_LONG).show();
            builder.setMessage(R.string.SignUpWarningInfo)
                    .setPositiveButton(R.string.gotIt, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Intent explicitServiceIntentUSA = new Intent(getActivity(), Service.class);
                            explicitServiceIntentUSA.putExtra("country", countryChosen );
                            getActivity().startService(explicitServiceIntentUSA);

                        }
                    })
                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {                        
                            return;
                        }
                    });
            // Create the AlertDialog object and return it
            return builder.create();
        }
    }
}

ConnectionStatus.java

public class ConnectionStatus {

    private Context _context;

    private ProgressDialog progressDialog = null;

    public ConnectionStatus(Context context) {
        this._context = context;
    }
    public void showProgress(){
            progressDialog = new ProgressDialog(_context);
            progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }
}

Error happens when I click USA. Error I get

         java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
                  at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:154)
                  at android.app.AlertDialog.<init>(AlertDialog.java:109)
                  at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
                  at com.a2.a2.ConnectionStatus.showProgress(ConnectionStatus.java:66)
                  at com.a2.a2.signUp.Choose_CountryFragment$1.onCheckedChanged(Choose_CountryFragment.java:73)

Solution

  • Your Context returning null

    Change code in Choose_CountryFragment

    public class Choose_CountryFragment extends Fragment {
        ...
       protected Context mContext;
       private ConnectionStatus connectionStatus
       ...
    
        public Choose_CountryFragment() {
        }
    
          @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 final Bundle savedInstanceState) {
            View rootView =  inflater.inflate(R.layout.fragment_choose__country, container, false);
           ...
           connectionStatus = new ConnectionStatus(mContext);// initialize ConnectionStatus here
           ...
        }
    
    }
    

    Override onAttach Inside Choose_CountryFragment

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }