android:从onCreateDialog中调用redraw of dialog

时间:2022-08-27 12:15:38

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();
    }
});