问题描述
如何使用AlertDialog同步获取文本? 例如,我想做这样的事情:
public String GetTextDialog()
{
final EditText text = new EditText(activity);
// Gets the chat
final AlertDialog.Builder dialog = new AlertDialog.Builder(activity);
dialog.setView(text);
dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
}
});
// Display
dialog.show();
// Return text after dialog is complete
return text.getText().toString();
}
编辑 :你认为这是一个更好的方法:
interface TextHandler
{
public String Title();
public void HandleText(String text);
}
public static boolean ShowTextDialog(
String title,
String defaultValue,
final TextHandler posButton,
final TextHandler negButton,
final TextHandler neutButton,
int width
)
{
// Check for already existing dialog
if(showDialog) return false;
showDialog = true;
// Verify context
if(context == null)
{
Log.e("Crystal", "Screen::ShowTextDialog No Context!");
showDialog = false;
return false;
}
// Verify we have buttons
if(neutButton == null)
{
if(posButton == null || negButton == null)
{
Log.e("Crystal", "Screen::ShowTextDialog Must supply both postive and negative buttons!");
showDialog = false;
return false;
}
}
else
{
if(posButton != null || negButton != null)
{
Log.e("Crystal", "Screen::ShowTextDialog Can't have neutral button with other type!");
showDialog = false;
return false;
}
}
// Create the dialog
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
if(title != null) dialog.setTitle(title);
// Create the chat
final EditText text = new EditText(context);
text.setSingleLine();
if(defaultValue != null) text.setText(defaultValue);
if(width != 0) text.setWidth((int)(width*context.getResources().getDisplayMetrics().density));
// Add text to dialog
dialog.setView(text);
if(posButton != null)
{
dialog.setPositiveButton(posButton.Title(), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
posButton.HandleText(text.getText().toString());
showDialog = false;
}
});
}
if(negButton != null)
{
dialog.setNegativeButton(negButton.Title(), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
negButton.HandleText(text.getText().toString());
showDialog = false;
}
});
}
if(neutButton != null)
{
dialog.setNeutralButton(neutButton.Title(), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
neutButton.HandleText(text.getText().toString());
showDialog = false;
}
});
}
// Display
dialog.show();
return true;
}
并且这样称呼:
private void GetUsernameDialog()
{
ShowTextDialog(
"Enter Username", // Title
username, // Default value
new TextHandler() // Positive button
{
public String Title() { return "Ok"; }
public void HandleText(String text) { SetUsername(text); }
},
new TextHandler() // Negative button
{
public String Title() { return "Cancel"; }
public void HandleText(String text) { }
},
null, // Neutral button
200 // Width
);
}
1楼
你可以在一个包含Looper的替代线程中运行该对话框,在对话框解雇时终止looper,让主UI线程等待另一个......但这是一个如此复杂的设计,如果上帝可能会杀死一只小猫你做吧。 请问您为什么需要同步数据访问? 这只是为了方便,还是你有设计理由?
如果它是关于从对话框设置之前访问状态,那么嵌套的匿名类就是你的答案。
你已经在上面的片段中有那些;
他们可以自动访问嵌套函数的final
变量和嵌套类的成员。