Android: Alert Dialog disappears and executes next

2019-02-21 02:54发布

问题:

I'm using a GPS disabled AlertDialog and once the user enables GPS, I move onto another Activity via an Intent. The problem is that the AlertDialog appears and then moves onto the next activity before I can click on any button on the Dialog. What do i need to do so that the next Intent executes only once I have performed the action on the AlertDialog? Here is my code:

public void OnClickNearMe(View view) {
    LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        createGpsDisabledAlert();
    }
    Location locationResult = null;
    MyLocation myLocation = new MyLocation();
    boolean locationEnabled = myLocation.getLocation(this, locationResult);

    if (locationEnabled == true) {
        locationResult = myLocation.getLocationResult();
        showResultsScreen(locationResult);
    } else
        Toast.makeText(this, R.string.noLoc, Toast.LENGTH_LONG).show();

    return;
}

private void createGpsDisabledAlert() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Your GPS is disabled! Would you like to enable it?")
            .setCancelable(false)
            .setPositiveButton("Enable GPS",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            showGpsOptions();
                        }
                    });
    builder.setNegativeButton("Do nothing",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}

private void showGpsOptions() {
    Intent gpsOptionsIntent = new Intent(
            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(gpsOptionsIntent);
}

private void showResultsScreen(Location locationResult) {
    Intent resultsIntent = new Intent(this, ResultScreenList.class);
    startActivity(resultsIntent);
}

Thanks in advance for all your answers!!!

回答1:

After you show the dialog, createGpsDisabledAlert will continue on and finish even before you click OK or Cancel. Maybe refactor the rest of the code in OnClickNearMe to another method and call it only if location isn't enabled, and also call it after your settings page. Maybe something like:

public void OnClickNearMe(View view) {
    LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){   
        createGpsDisabledAlert();   
    } else {
        getLocation();
    }
}

private void getLocation() {
    Location locationResult = null;
    MyLocation myLocation = new MyLocation();
    boolean locationEnabled = myLocation.getLocation(this, locationResult);

    if (locationEnabled == true) {
        locationResult = myLocation.getLocationResult();
        showResultsScreen(locationResult);
    } else {
        Toast.makeText(this, R.string.noLoc, Toast.LENGTH_LONG).show();
    }
}

private void createGpsDisabledAlert(){   
    AlertDialog.Builder builder = new AlertDialog.Builder(this);   
    builder.setMessage("Your GPS is disabled! Would you like to enable it?")   
         .setCancelable(false)   
        .setPositiveButton("Enable GPS",   
             new DialogInterface.OnClickListener(){   
              public void onClick(DialogInterface dialog, int id){
                   showGpsOptions(); 
                   getLocation();
              }   
         });   
         builder.setNegativeButton("Do nothing",   
              new DialogInterface.OnClickListener(){   
              public void onClick(DialogInterface dialog, int id){   
                   dialog.cancel(); 
              }   
         });   
    AlertDialog alert = builder.create();
    alert.show();
    }  

    private void showGpsOptions(){   
            Intent gpsOptionsIntent = new Intent(   
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);   
           startActivity(gpsOptionsIntent);   
    }  

    private void showResultsScreen(Location locationResult){
         Intent resultsIntent = new Intent(this, ResultScreenList.class); 
           startActivity(resultsIntent);
    }
}


回答2:

It looks like the problem is that while the GPS location isn't enabled, you are still getting a location in myLocation.getLocation.

After you call createGpsDisabledAlert(), you probably should return instead of continuing with the method.