i've placed a button on my dialog layout that i would like to trigger a complete redraw of the Dialog. However, it appears you can't open dialogs from within onCreateDialog, and i can't find a way to dismiss dialogs without using setPositiveButton
and the like, as it's the only Button override that gives the dialog as a parameter (and i can't find a way to get it for a Button that's part of the layout). here's all the relevant code:
我在对话框布局上放了一个按钮,我想触发对话框的完整重绘。但是,看起来你无法从onCreateDialog中打开对话框,并且我找不到一种方法来在不使用setPositiveButton之类的情况下解除对话框,因为它是唯一的Button覆盖,它将对话框作为参数(我可以'找到一种方法来获得布局的一部分按钮。这是所有相关代码:
case DIALOG_WIFI_PREF:
{
Dialog dialog = new Dialog(this);
final View dialogLayout = inflater.inflate(R.layout.dialog_wifi_pref, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(dialogLayout);
builder.setTitle("IP Configuration");
final EditText ipIn = (EditText)dialogLayout.findViewById(R.id.wifi_ip_in);
final EditText portIn = (EditText)dialogLayout.findViewById(R.id.wifi_port_in);
final EditText labelIn = (EditText)dialogLayout.findViewById(R.id.site_label_in);
final EditText codeIn = (EditText)dialogLayout.findViewById(R.id.activation_code);
final Spinner siteSpn = (Spinner)dialogLayout.findViewById(R.id.site_spn);
final Button deleteBtn = (Button)dialogLayout.findViewById(R.id.delete_btn);
final Cursor cur = mDb.rawQuery("SELECT * FROM " + DbSchema.SiteSchema.TABLE_NAME, null);
cur.moveToFirst();
final SimpleCursorAdapter tempAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_spinner_item,
cur,
new String[] { DbSchema.SiteSchema.COLUMN_LABEL },
new int[] { android.R.id.text1 }
);
tempAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
siteSpn.setAdapter(tempAdapter);
//fill the initial values
String initSite = pref.getString("site_id", "New Site");
String spnLabel = null;
final Cursor initCur = mDb.query(DbSchema.SiteSchema.TABLE_NAME, null, DbSchema.SiteSchema.COLUMN_LABEL + "=?", new String[] { initSite }, null, null, null);
initCur.moveToFirst();
cur.moveToFirst();
if(initCur.getCount()>0) {
ipIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_IP)));
portIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_PORT)));
codeIn.setText(initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE)));
spnLabel = initCur.getString(initCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
labelIn.setText(spnLabel);
if(cur.getCount()>0) {
do {
if(spnLabel.equals(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL)))) {
siteSpn.setSelection(cur.getPosition());
}
} while(cur.moveToNext());
}
}
siteSpn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
cur.moveToFirst();
if(cur.getCount()>0) {
do {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
if(tempLabel.equals(((TextView)view.findViewById(android.R.id.text1)).getText().toString())) {
labelIn.setText(tempLabel);
portIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_PORT)));
ipIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_IP)));
codeIn.setText(cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE)));
}
} while(cur.moveToNext());
}
}
public void onNothingSelected(AdapterView<?> parent) {
//
}
});
deleteBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//do things
cur.moveToFirst();
while(cur.moveToNext()) {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
View selectedSiteView = siteSpn.getSelectedView();
String label = ((TextView)selectedSiteView.findViewById(android.R.id.text1)).getText().toString();
if(tempLabel.equals(label)) {
mDb.delete(DbSchema.SiteSchema.TABLE_NAME, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { label });
//dialogLayout.invalidate();
//dialog.dismiss();
//dialog.invalidate();
//v.getParent().invalidate();
}
}
}
});
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
cur.moveToFirst();
boolean newRecord = true;
do {
String tempLabel = null;
if(cur.getCount()>0) {
tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
}
if(tempLabel!=null && tempLabel.equals(labelIn.getText().toString())) {
//update
ContentValues cv = new ContentValues();
cv.put(DbSchema.SiteSchema.COLUMN_IP, ipIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_PORT, portIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE, codeIn.getText().toString());
MobileDashboardActivity.this.mDb.update(DbSchema.SiteSchema.TABLE_NAME, cv, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { tempLabel });
newRecord = false;
break;
}
} while(cur.moveToNext());
if(newRecord) {
//new entry
ContentValues cv = new ContentValues();
cv.put(DbSchema.SiteSchema.COLUMN_IP, ipIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_PORT, portIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_LABEL, labelIn.getText().toString());
cv.put(DbSchema.SiteSchema.COLUMN_ACTIVATION_CODE, codeIn.getText().toString());
MobileDashboardActivity.this.mDb.insert(DbSchema.SiteSchema.TABLE_NAME, null, cv);
}
SharedPreferences.Editor editor = pref.edit();
editor.putString("site_id", labelIn.getText().toString());
editor.putString("activation", codeIn.getText().toString());
editor.commit();
MobileDashboardActivity.this.writeCSVFile("dashboard_settings.csv");
dialog.dismiss();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
dialog = builder.create();
return dialog;
}
1 个解决方案
#1
0
i ended up following this example:
我最终得到了这个例子:
http://developmentality.wordpress.com/2009/10/31/android-dialog-box-tutorial/
which uses the Command pattern to proc outer logic:
它使用Command模式来处理外部逻辑:
http://en.wikipedia.org/wiki/Command_pattern
and here are the files:
这是文件:
Command.java:
package com.conceptualsystems.dialog;
[...import statements...]
public interface Command {
public void execute();
public static final Command NO_OP = new Command() { public void execute() {} };
}
CommandWrapper.java:
package com.conceptualsystems.dialog;
[...import statements...]
public class CommandWrapper implements DialogInterface.OnClickListener {
private Command command;
public CommandWrapper(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
command.execute();
}
}
relevant code from MainActivity.java (member variable definition):
MainActivity.java中的相关代码(成员变量定义):
Command delete = new Command() {
public void execute() {
removeDialog(DIALOG_WIFI_PREF);
showDialog(DIALOG_WIFI_PREF);
}
};
dialog code utilizing Command class and CommandWrapper:
使用Command类和CommandWrapper的对话框代码:
builder.setNeutralButton("Delete", new CommandWrapper(delete) {
public void onClick(DialogInterface dialog, int which) {
//do things
cur.moveToFirst();
while(cur.moveToNext()) {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
View selectedSiteView = siteSpn.getSelectedView();
String label = ((TextView)selectedSiteView.findViewById(android.R.id.text1)).getText().toString();
if(tempLabel.equals(label)) {
mDb.delete(DbSchema.SiteSchema.TABLE_NAME, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { label });
}
}
dialog.dismiss();
this.execute();
}
});
#1
0
i ended up following this example:
我最终得到了这个例子:
http://developmentality.wordpress.com/2009/10/31/android-dialog-box-tutorial/
which uses the Command pattern to proc outer logic:
它使用Command模式来处理外部逻辑:
http://en.wikipedia.org/wiki/Command_pattern
and here are the files:
这是文件:
Command.java:
package com.conceptualsystems.dialog;
[...import statements...]
public interface Command {
public void execute();
public static final Command NO_OP = new Command() { public void execute() {} };
}
CommandWrapper.java:
package com.conceptualsystems.dialog;
[...import statements...]
public class CommandWrapper implements DialogInterface.OnClickListener {
private Command command;
public CommandWrapper(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
command.execute();
}
}
relevant code from MainActivity.java (member variable definition):
MainActivity.java中的相关代码(成员变量定义):
Command delete = new Command() {
public void execute() {
removeDialog(DIALOG_WIFI_PREF);
showDialog(DIALOG_WIFI_PREF);
}
};
dialog code utilizing Command class and CommandWrapper:
使用Command类和CommandWrapper的对话框代码:
builder.setNeutralButton("Delete", new CommandWrapper(delete) {
public void onClick(DialogInterface dialog, int which) {
//do things
cur.moveToFirst();
while(cur.moveToNext()) {
String tempLabel = cur.getString(cur.getColumnIndex(DbSchema.SiteSchema.COLUMN_LABEL));
View selectedSiteView = siteSpn.getSelectedView();
String label = ((TextView)selectedSiteView.findViewById(android.R.id.text1)).getText().toString();
if(tempLabel.equals(label)) {
mDb.delete(DbSchema.SiteSchema.TABLE_NAME, DbSchema.SiteSchema.COLUMN_LABEL+"=?", new String[] { label });
}
}
dialog.dismiss();
this.execute();
}
});