【问题标题】:Custom Dialog constructor自定义对话框构造函数
【发布时间】:2012-08-09 10:36:42
【问题描述】:

我的界面:

public interface LoginDialogDismissListener {
    void loginDialogCancel();
    void loginDialogSuccess();
}

我的活动:

public class MainActivity extends Activity implements LoginDialogDimissListener {
    public void loginDialogCancel() {
        //do stuff here     
    }

    public void loginDialogSuccess() {
        //do some other stuff here!
    }
}

我的登录对话框:

public class LoginDialog extends Dialog implements OnClickListener, LoginChecker {

    private ProgressBar pbLogin;
    private TextView tvLoginstatus;
    private Button cancel;
    private Button save;
    private EditText username;
    private EditText password;

    public LoginDialog(Context context) {
        super(context);
        setContentView(R.layout.login_dialog);
        pbLogin = (ProgressBar) findViewById(R.id.progressBarLogin);
        tvLoginstatus = (TextView) findViewById(R.id.dialogTvLoginstatus);
        cancel = (Button) findViewById(R.id.bDialogCancel);
        save = (Button) findViewById(R.id.bDialogSave);
        username = (EditText) findViewById(R.id.dialogEtUsername);
        password = (EditText) findViewById(R.id.dialogEtPassword);

        setTitle("Brukerdata");
        pbLogin.setVisibility(View.INVISIBLE);
        tvLoginstatus.setVisibility(View.INVISIBLE);

        cancel.setOnClickListener(this);
        save.setOnClickListener(this);
        //setOnDismissListener(this);
    }

    public void onClick(View v) {
        if (v.getId() == R.id.bDialogSave) {
            saveClick();
        }
        else if (v.getId() == R.id.bDialogCancel) {
            cancelClick();
        }
    }

    private void saveClick() {
        save.setEnabled(false);
        String[] credentials = {username.getText().toString(), password.getText().toString()};
        pbLogin.setVisibility(View.VISIBLE);
        CheckLoginTask logintask = new CheckLoginTask(this, credentials, 0);
        logintask.execute();
    }

    private void cancelClick() {
        this.dismiss();
        //Here I want to call LoginDialogDismissListener.loginDialogCancel()
    }

    //Called from my AsyncTask (CheckLoginTask)
    public void onLoginSuccess(int requestCode) {
        this.dismiss();
        //Here I want to call LoginDialogDismissListener.loginDialogSuccess()
    }

    //Called from my AsyncTask (CheckLoginTask)
    public void onLoginFail(int requestCode) {
        pbLogin.setVisibility(View.INVISIBLE);
        tvLoginstatus.setText("Feil brukernavn/passord ...");
        tvLoginstatus.setVisibility(View.VISIBLE);
        save.setEnabled(true);
    }
}

如果您在代码中阅读了我的 cmets,您会看到我想使用 MainActivity 从我的接口实现的方法来调用它。问题是我不知道如何将我的活动只发送一次到我的 LoginDialog。

我的意思是,首先它需要 Context,其次我想为它提供 LoginDialogDismissListener(可能应该更改该名称...),这是我的活动。

我觉得有比这更好的解决方案:

//Constructor
public LoginDialog(Context context, LoginDialogDismissListener listener) {
}

//Activity creating the Dialog
new LoginDialog(this, this);

我尝试将构造函数定义为仅将 LoginDialogDismissListener 作为参数,但我不能强制转换它或以某种方式获取我的 super(context) 所需的上下文

【问题讨论】:

  • 其他活动中有此对话框的用途

标签: java android interface dialog


【解决方案1】:

来自#android-dev 的回答

创建一个父 Activity 来实现我的接口并让所有 Activity 再次扩展它。

【讨论】:

    【解决方案2】:

    不要使用“this”,使用 getApplicationContext()。

    【讨论】:

    • 无法从我的对话框中访问该方法
    • 不,我的意思是在新的 LoginDialog(this,this) 中将 applicationContext() 传递给它;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多