我正在测试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();
,但它仍然无法显示。更令人恐惧的是,如果不允许这样做,它就不会给我一个例外情况。
所以,我的问题是这样的:按下按钮一旦被解除(自动),我是否每次都要创建一个新的对话框?
答案 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();
}
答案 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();
}
});
关闭对话框后单击按钮。它肯定会重新出现。