我正在尝试向位于警告对话框中的编辑文本字段添加一些文本验证。它会提示用户输入名称。
我想添加一些验证,以便如果他们输入的内容为空或空,除了创建Toast说错误之外,它不会做任何事情。
到目前为止,我有:
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Record New Track");
alert.setMessage("Please Name Your Track:");
// Set an EditText view to get user input
final EditText trackName = new EditText(this);
alert.setView(trackName);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String textString = trackName.getText().toString(); // Converts the value of getText to a string.
if (textString != null && textString.trim().length() ==0)
{
Context context = getApplicationContext();
CharSequence error = "Please enter a track name" + textString;
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, error, duration);
toast.show();
}
else
{
SQLiteDatabase db = waypoints.getWritableDatabase();
ContentValues trackvalues = new ContentValues();
trackvalues.put(TRACK_NAME, textString);
trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);
}
但这只是关闭警报对话框然后显示Toast。我希望警报对话框仍然在屏幕上。
由于
答案 0 :(得分:3)
我认为你应该重新创建Dialog
,因为在DialogInterface
中作为参数给出的onClick()
似乎没有给你一个选项来阻止{{1}的关闭}}
我还有一些提示:
尝试使用Dialog
,Activity.onCreateDialog()
,当然还有Activity.onPrepareDialog()
。它们使对话框的使用变得更加容易(至少对我而言),对话框的使用看起来更像菜单用法。使用这些方法,您还可以更加轻松地再次显示对话框。
我想给你一个提示。这不是你问题的答案,但在答案中这样做更具可读性。
您可以简单地执行以下操作,而不是保留对Activity.showDialog()
对象的引用:
AlertDialog.Builder()
为您保存参考和大量输入;)。 (几乎?)new AlertDialog.Builder(this)
.setTitle("Record New Track")
.setMessage("Please Name Your Track:")
//and some more method calls
.create();
//or .show();
的所有方法都返回一个AlertDialog.Builder
对象,您可以直接调用该方法。
同样适用于AlertDialog.Builder
s:
Toast
答案 1 :(得分:3)
我在我的类中创建了一个新方法,该方法显示警报并在该方法中放置用于创建警报的所有代码。然后在调用Toast之后我调用该方法。假设我将该方法命名为createAlert(),然后我将其命名为
createAlert(){
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Record New Track");
alert.setMessage("Please Name Your Track:");
// Set an EditText view to get user input
final EditText trackName = new EditText(this);
alert.setView(trackName);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String textString = trackName.getText().toString(); // Converts the value of getText to a string.
if (textString != null && textString.trim().length() ==0)
{
Context context = getApplicationContext();
CharSequence error = "Please enter a track name" + textString;
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, error, duration);
toast.show();
createAlert();
}
else
{
SQLiteDatabase db = waypoints.getWritableDatabase();
ContentValues trackvalues = new ContentValues();
trackvalues.put(TRACK_NAME, textString);
trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);
}
}
答案 2 :(得分:1)
您应该做的是创建一个自定义xml布局,包括文本框和“确定”按钮,而不是使用.setPositiveButton。 然后,您可以向按钮添加单击侦听器,以验证数据并关闭对话框。
应该在CreateDialog中使用:
protected Dialog onCreateDialog(int id)
{
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (id==EDIT_DIALOG)
{
final View layout = inflater.inflate(R.layout.edit_dialog, (ViewGroup) findViewById(R.id.Layout_Edit));
final Button okButton=(Button) layout.findViewById(R.id.Button_OkTrack);
final EditText name=(EditText) layout.findViewById(R.id.EditText_Name);
okButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
String textString = trackName.getText().toString();
if (textString != null && textString.trim().length() ==0)
{
Toast.makeText(getApplicationContext(), "Please enter...", Toast.LENGTH_LONG).show();
} else
removeDialog(DIALOG_EDITTRACK);
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
builder.setTitle("Edit text");
AlertDialog submitDialog = builder.create();
return submitDialog;
}
答案 3 :(得分:0)
使用此代码显示对话框。
public void onClick(DialogInterface dialog, int whichButton) {
String textSt`enter code here`ring = trackName.getText().toString(); // Converts the value of getText to a string.
if (textString != null && textString.trim().length() ==0)
{
Context context = getApplicationContext();
CharSequence error = "Please enter a track name" + textString;
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, error, duration);
toast.show();
new AlertDialog.Builder(this)
.setTitle("Message")
.setMessage("please enter valid field")
.setPositiveButton("OK", null).show();
}
这将为您创建一个对话框,editText
为空或您想要的条件。
答案 4 :(得分:0)
//如果未实例化视图,则它始终为edittext值返回null。
View v = inflater.inflate(R.layout.new_location_dialog, null);
builder.setView(v);
final EditText titleBox = (EditText)v.findViewById(R.id.title);
final EditText descriptionBox = (EditText)v.findViewById(R.id.description);
答案 5 :(得分:0)
即使这是一篇老文章,下面的代码也会对某些人有所帮助。我使用了自定义的布局和扩展的DialogFragment类。
// put each link text and href in the linkUrls array
$(links).each( (i, link) => {
linkUrls[String($(link).text())] = $(link).attr('href');
})
let results = {};
results['title'] = pageTitle;
let num = 0;
for (const linkText in linkUrls) {
const response = await axios.get(linkUrls[linkText])
.then( (r) => {
if (r.status != 200) {
num += 1;
results[ 'broken link ' + String(num)] = {
'text': linkText,
'url': linkUrls[linkText],
'status code': r.status
}
}
})
.catch( (err) => {
num += 1;
results[ 'broken link ' + String(num)] = {
'text': linkText,
'url': linkUrls[linkText],
'status code': err.response.status
}
})
}
console.log('results: ', results);
return results;