我有一个“DialogHelper”类,其中在各种上下文中使用了一堆静态方法,以便更容易地使用Dialog。一种这样的方法是“三选对话框”,其中用户有三个按钮可供选择以继续前进:
public static AlertDialog createThreeChoiceDialog(final MyActivity activity, String title, String firstChoiceText,
String secondChoiceText, String thirdChoiceText, View.OnClickListener firstChoiceListener, View.OnClickListener secondChoiceListener,
View.OnClickListener thirdChoiceListener) {
final View dView = activity.getLayoutInflater().inflate(R.layout.three_choice_dialog, null);
final TextView explanatoryTV = (TextView) dView.findViewById(R.id.explanatoryTV);
final TextView firstChoiceTV = (TextView) dView.findViewById(R.id.firstChoiceTV);
final TextView secondChoiceTV = (TextView) dView.findViewById(R.id.secondChoiceTV);
final TextView thirdChoiceTV = (TextView) dView.findViewById(R.id.thirdChoiceTV);
explanatoryTV.setText(title);
firstChoiceTV.setText(firstChoiceText);
secondChoiceTV.setText(secondChoiceText);
thirdChoiceTV.setText(thirdChoiceText);
firstChoiceTV.setOnClickListener(firstChoiceListener);
secondChoiceTV.setOnClickListener(secondChoiceListener);
thirdChoiceTV.setOnClickListener(thirdChoiceListener);
AlertDialog = etc...
return alertDialog;
}
我称之为:
private void doSomething() {
final AlertDialog alert = DialogHelper.createThreeChoiceDialog(activity, "title", "choice1", "choice2", "choice3",
new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 1
alert.dismiss();
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 2
alert.dismiss();
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 3
alert.dismiss();
}
});
alert.show();
}
但是,“alert.show()”方法会响起错误:
variable 'alert' might not have been initialized yet
我的问题是,处理这种情况的最佳方法是什么?我想在用户选择一个选项时关闭该对话框。
这是我目前的解决方法:
private void doSomething() {
final ArrayList<AlertDialog> alerts = new ArrayList<>(); //<-- added ArrayList of AlertDialogs
final AlertDialog alert = DialogHelper.createThreeChoiceDialog(activity, "title", "choice1", "choice2", "choice3",
new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 1
alerts.get(0).dismiss(); //<-- accessed via ArrayList
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 2
alerts.get(0).dismiss(); //<-- accessed via ArrayList
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something 3
alerts.get(0).dismiss(); //<-- accessed via ArrayList
}
});
alerts.add(alert); //<-- add alert to ArrayList
alert.show();
}
它有效,但这绝不是最好的做法。我曾经遇到过这个问题几次,所以我终于决定问一下处理它的最佳方法是什么。
答案 0 :(得分:1)
在声明和创建该实例时,您基本上是在尝试引用类的实例 - 这是不可能的。
我看到您的选项如下:
这基本上是你使用ArrayList
的解决方法,但你也可以为此创建自己的类。
声明alert
是包含private
方法的类的doSomething
成员,而不是在方法本身中声明它。
这种方法有几个优点(和1个缺点)。
第一个优点是它可以解决您的问题。第二个原因是因为它具有良好的编码实践:通常,采用带有许多参数的方法被认为是脏的。如果它们是构造函数方法,Clean Code约定建议用构造函数替换它们。
我要建议的实现的缺点是Dialog行为是单击一个选项将始终关闭对话框。
public class MyDialogBuilder {
private AlertDialog alert;
public MyDialogBuilder withActivity(Activity activity){
final View dView = activity.getLayoutInflater().inflate(R.layout.three_choice_dialog, null);
alert = ...;
return this;
}
public MyDialogBuilder withFirstChoice(String choiceText, final ChoiceAction action){
final TextView firstChoiceTV = (TextView) alert.findViewById(R.id.firstChoiceTV);
firstChoiceTV.setText(choiceText);
firstChoiceTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
action.perform();
alert.dismiss();
}
});
return this;
}
// Similar implementations for the other methods here...
public AlertDialog create() {
return alert;
}
interface ChoiceAction {
void perform();
}
}
您的通话代码就像
MyDialogBuilder builder = new MyDialogBuilder();
AlertDialog alert = builder.withActivity(activity)
.withTitle("Dialog title")
.withFirstChoice("choice 1", new MyDialogBuilder.ChoiceAction() {
@Override
public void perform() {
//do something 1
}
})
.withSecondChoice("choice 2", new MyDialogBuilder.ChoiceAction() {
@Override
public void perform() {
//do something 2
}
})
.withThirdChoice("choice 3", new MyDialogBuilder.ChoiceAction() {
@Override
public void perform() {
//do something 3
}
})
.create();
我建议使用第三种方法,因为我认为在大多数情况下,当用户选择一个选项时,您希望关闭对话框。如果要在对话框中显示一些进度条,可以在MyDialogBuilder
上创建其他方法,这些方法会在回调中调用alert.dismiss()
。希望这会有所帮助。