【问题标题】:Pass value from activity to CustomDialog class将值从活动传递到 CustomDialog 类
【发布时间】:2011-11-18 20:25:06
【问题描述】:

您好,我想将通过 SharedPreferences 在我的活动中保存的值“用户名”传递给 CustomDialog 类中的 EditText。 这意味着我想在我的 CustomDialog 类中使用EditText.settext (username)。 有人可以帮我实现这一目标吗?

谢谢。

主要活动中的SharedPreference代码:

public class AndroidLogin extends Activity implements OnClickListener {
   public SharedPreferences mPrefs;
   ...

@Override     
protected void onPause() { 
    super.onPause(); 
    Editor e = mPrefs.edit();
    e.putString(USERNM, username);
    e.commit();
}
}

现在我想在我的 CustomDialog 类中将值“USERNM”设置为 EditText:

public class MyCustomForm extends Dialog {

  public SharedPreferences mPrefs;
    ...
    @Override
      public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

        setContentView(com.sencide.R.layout.inlogdialog);
        EditText userTest = (EditText)findViewById(R.id.txtUserName);

        mPrefs = getSharedPreferences("PREFS_NAME", this.MODE_PRIVATE); // does not work
        String text = mPrefs.getString("USERNM", ""); 
        userTest.setText(text);
  }
}

自定义对话框:

import android.app.Dialog;
...

public class MyCustomForm extends Dialog {

String mTextChange;
public SharedPreferences mPrefs;


public interface ReadyListener {
    public void ready(String user, String pass, boolean save);
}

private String usernm;
private String passwd;
private ReadyListener readyListener;


public MyCustomForm(Context context, String user, String pass, ReadyListener readyListener) {
    super(context);
    this.usernm = user;
    this.passwd = pass;
    this.readyListener = readyListener;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(com.sencide.R.layout.inlogdialog);
    setTitle("Login:");
    EditText userTest = (EditText)findViewById(R.id.txtUserName);
    //mPrefs = getSharedPreferences("PREFS_NAME", this.MODE_PRIVATE);
    //String text = mPrefs.getString("USERNM", "");
    userTest.setText();

    Button buttonConfrim = (Button) findViewById(R.id.btnConfirm);
    buttonConfrim.setOnClickListener(new OKListener());

    Button buttonCancel = (Button) findViewById(R.id.btnCancel);
    buttonCancel.setOnClickListener(new CancelListener());


}


private class OKListener implements android.view.View.OnClickListener {

    public void onClick(View v) {
        EditText user = (EditText) findViewById(R.id.txtUserName);
        EditText pass = (EditText) findViewById(R.id.txtpass);
        CheckBox saveuser = (CheckBox) findViewById(R.id.saveuser);

        readyListener.ready(user.getText().toString(),pass.getText().toString(), saveuser.isChecked());

        MyCustomForm.this.dismiss();
    }
}


private class CancelListener implements android.view.View.OnClickListener {

    public void onClick(View v) {
        MyCustomForm.this.dismiss();
    }
}
}

编辑,在我的主要活动中:

public void createDialog(Context context) { 
     SharedPreferences prefs = context.getSharedPreferences("mPrefs", Context.MODE_PRIVATE); 
     String user = prefs.getString("USERNM", ""); 
        new MyCustomForm(context, user, user, null); // where the class that is calling this is aa OnTextChangeListener 
    } 

这就是我显示对话框的方式:

public void getLoginData() throws Exception {

    if (checkInternetConnection() == true){
        MyCustomForm dialog = new MyCustomForm (this, "", "", new OnReadyListener());
        dialog.setContentView(R.layout.inlogdialog);
        dialog.show();       
    }

【问题讨论】:

  • 有什么问题?您能否发布异常日志并明确说明问题所在?
  • 嗨杰克,问题是值被保存了,没关系,但我不知道如何通过 SharedPreferences 将它传递给一个类。从活动到活动,我可以使用 Intent,但不能从活动到课程。我已经在 Dialog 类中创建 SharedPreferences 代码时遇到了问题。

标签: android dialog sharedpreferences android-edittext


【解决方案1】:

not recommended 传递上下文(以及通过扩展视图)。我建议为您的对话创建一个监听器,可能类似于 OnTextChangedListener#onChange(String)

在您的活动中创建侦听器并将其传递给您的对话框。然后当对话完成时,调用监听器onChange(String) 方法,该方法将被设置为向 UI 线程处理程序触发事件以更新编辑文本。相反,您可以只传递处理程序。

public class MyDialog exteds Dialog implements Dialog.OnClickListener {
    OnTextChangeListener mListener;
    String mTextChange;

    public MyDialog(OnTextChangeListener listener) {
        mListener = listener;
        // set up your stuff
        setOnClickListener(this);
    }

    ...

    public void onClick(DialogInterface dialog) {
        // Do what ever you need to do to get set mTextChange
        mListener.onChange(mTextChange);
    }

    public static interface OnTextChangeListener {
        void onChange(String textChange);
}

这是你的传递方式:

 public void createDialog(Context context) {
     SharedPreferences prefs = context.getSharedPreferences("MyPreferencesName", Context.MODE_PRIVATE);
     String user = prefs.getString("what_ever_string_you_want", "fall_back_user_name");
        new MyDialog(user, this); // where the class that is calling this is aa OnTextChangeListener
    }

【讨论】:

  • 嗨 AedonEtLIRA,感谢您的回答,我已经在活动中创建了一个监听器,请参阅编辑后的代码。您能否帮我提供一些示例代码,以将使用 SharedPreferences 保存的用户名值传递给 Dialog.class?我是 Android 新手。
  • @Lars 这就是我要做的。
  • 嗯,我做不到。这不能通过 SharedPreferences 完成吗?因为我还通过 SharedPreferences 保存了值。如果不感谢您的帮助和努力。
  • 我不知道如何将 SharedPreferences 中保存的 USERNM 值传递给 CustomDialog,我会从 CustomDialog 发布整个代码,也许你有办法?
  • 嗯,好的,谢谢代码,但在我保存值后,edittext 保持为空。查看我编辑的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多