再次显示相同的AlertDialog

时间:2017-02-09 09:12:22

标签: android android-alertdialog

我正在测试AlertDialog的行为以集成到更大的组件中。我无法再显示相同的对话框。这是测试代码:

public class MainActivity extends AppCompatActivity {

    private AlertDialog alertDialogACCreationRetry;

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

        alertDialogACCreationRetry = new AlertDialog.Builder(this)
                .setTitle("Account creation failed")
                .setMessage("There was a problem connecting to the Network. Check your connection.")
                .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).create();
        alertDialogACCreationRetry.show();

        alertDialogACCreationRetry.show();
    }
}

我已尝试将alertDialogACCreationRetry.show();放入“重试”按钮,但仍然无法显示。我还尝试将alertDialogACCreationRetry.dismiss();放入重试按钮,然后在外面调用alertDialogACCreationRetry.show();,但它仍然无法显示。更令人恐惧的是,如果不允许这样做,它就不会给我一个例外情况。

所以,我的问题是这样的:按下按钮一旦被解除(自动),我是否每次都要创建一个新的对话框?

5 个答案:

答案 0 :(得分:7)

public void showAlertDialog() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setTitle("Time");
    builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int i) {
            dialog.cancel();
            // call function show alert dialog again
            showAlertDialog();
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    final AlertDialog alert = builder.create();
    alert.show();
}

enter image description here

答案 1 :(得分:0)

可能发生的事情是你在对话被取消之前调用.show(),所以这是一个无操作。当您从重试按钮侦听器返回时,该对话框将被解除。

PS这似乎与我的建议一致:DateTime.TryParseExact

为了使这项工作,您应该在网络代码真正重试该操作后再次调用该节目,可能是在后台线程或类似的东西中。

最后,另一方面,简单地再次创建对话框更有意义,因为在某些情况下保持相同的对话框可能会造成泄漏。

答案 2 :(得分:0)

您无需重新创建alertDialogACCreationRetry。您可以重复使用它,但不能同时显示同一对象的多个警报对话框。 show()方法在内部检查当前警报对话框是否已显示。如果它显示然后它将返回不执行任何其他新对话框将显示。

因此,请务必在对话

上致电dismiss()之前致电show()

这就是我试过的

@Nullable @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
  @Nullable Bundle savedInstanceState) {
getActivity().getSupportFragmentManager();

alertDialogACCreationRetry = new AlertDialog.Builder(getActivity())
    .setTitle("Account creation failed")
    .setMessage("There was a problem connecting to the Network. Check your connection.")
    .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {

      }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      }
    }).create();
alertDialogACCreationRetry.show();

View view = inflater.inflate(R.layout.frag1, container, false);
TextView viewById = (TextView) view.findViewById(R.id.frag1_text);
viewById.setOnClickListener(new View.OnClickListener() {
  @Override public void onClick(View v) {
    alertDialogACCreationRetry.show();
  }
});
return view;
}

alertDialogACCreationRetry.show()内的onClick()调用中,如果没有显示对话框,则显示对话框,否则它不会执行任何操作。

答案 3 :(得分:0)

您可以这样做:

public class MainActivity extends AppCompatActivity {

private AlertDialog alertDialogACCreationRetry;

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

    alertDialogACCreationRetry = new AlertDialog.Builder(this)
            .setTitle("Account creation failed")
            .setMessage("There was a problem connecting to the Network. Check your connection.")
            .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            }).create();

    alertDialogACCreationRetry.show();

    alertDialogACCreationRetry.getButton(AlertDialog.BUTTON_POSITIVE).
        setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean yourLogicGoFine = false;
            if (yourLogicGoFine){
                alertDialogACCreationRetry.dismiss();
            }else{
                Toast.makeText(finalizarActivity, "Something was wrong",
                        Toast.LENGTH_SHORT).show();
            }
        }
    });
  }
}
祝你好运!

答案 4 :(得分:0)

正如其他人所说,调用show()的原因并不是让对话框显示,因为它还没有被解雇。该方法的工作原理是设置对话框的可见性,而不是添加另一个对话框,因此您肯定无法获得同一对话框的2层。

您可以添加一个按钮来触发显示对话框,以确保对话框完全被解除。像这样:

findViewById(R.id.show_button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       alertDialogACCreationRetry.show();
    }
});

关闭对话框后单击按钮。它肯定会重新出现。