如何在Android中禁用AlertDialog的所有其他操作?

时间:2014-07-24 10:20:48

标签: android

我希望我的应用程序仅在启用GPS时才能运行,而且到目前为止,我的活动中还有我的应用程序。

private LocationManager locationManager;

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

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    checkForGPS();
}

private void checkForGPS(){
    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
    alertDialog.setTitle(getResources().getString(R.string.gps_error_title));
    alertDialog.setMessage(getResources().getString(R.string.gps_error_message));
    alertDialog.setButton(getResources().getString(R.string.alert_button_turn_on), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0);
        }
    });
    if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
        alertDialog.show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    checkForGPS();
}

现在我遇到了这个对话框的问题,因为它可以正常工作,但是我可以按下我的后退按钮而忽略它。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

将对话框设置为不可取消。

alertDialog.setCancelable(false);

这样它只能用命令dismiss();

关闭

您可以通过设置显示的对话框然后调用上面的命令来实现:

Dialog popup = alertDialog.show();

以后

popup.dismiss();

当屏幕旋转时,您还需要注意对话框,因为它会消失。最好的选择是在onSaveInstanceState内部保存一个布尔值,然后在onCreate内检查该状态。

答案 1 :(得分:1)

这里有两个选项:

您可以将警报设置为不可取消:

alertDialog.setCanceledOnTouchOutside(false); //This must be there. To avoid the alert getting dismissed on clicking outside the alert.
alertDialog.setCancelable(false); //This is optional if you are going for the next option. I would say in your case YOU SHOULDN'T DO THIS. I will explain why.

或者您可以覆盖alertDialogue中的后退按钮操作和finish()活动。

alertDialog.setOnKeyListener(new Dialog.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            finish();
        }
        return true;
     }
 });

让我稍微说明为什么我做了第二个选项。根据您的问题,AlertDialogue中的按钮启动一个活动以提示用户打开GPS。当我们写这一行时:

alertDialog.setCancelable(false);

它实际上禁用了后退按钮。但是,用户将如何退出应用程序?后退按钮将被禁用,无法退出应用程序(警报上没有按钮退出,后退按钮被禁用)。因此,应该有一些方法让用户退出应用程序而无需使用主页按钮等。我希望你理解我的观点。