如何从另一个活动或另一个线程触摸EditTextPrefences

时间:2017-05-22 10:18:56

标签: android android-asynctask preferences edittextpreference

我有一个设置Activity来存储名称,通过更改它必须首先发送到我的服务器的名称,如果它在服务器中的存储成功,那么它应该在我的EditTextPreference的摘要中设置。

一切正常,但最后我无法触摸EditTextPreference来设置名称。

此方法用于设置活动,但是从onPostExecute

AsyncTask调用
  public void setNewSetting(Activity activity) {
    EditTextPreference editTextPreference = (EditTextPreference) UserSettingActivity.this.findPreference(activity.getString(R.string.pref_name_key));
    name = sharedPreferences.getString(activity.getString(R.string.pref_name_key), "");
    editTextPreference.setSummary(name);
}

活动是我传递给AsyncTask然后传递给方法的设置活动。

我的问题就在这里,并为nullPoiterException

给我一​​个EditTextPreferences

抱歉我的英语不好。 并提前感谢。

1 个答案:

答案 0 :(得分:1)

方法1:

如果活动仍在后台,请将context传递给AsyncTask并创建设置活动的实例。

SettingsActivity settingsActivity = (SettingsActivity) context;

然后,在onPostExecute()

中调用该方法
settingsActivity.setNewSetting();

并且,在您的SettingsActivity中使用setNewSetting()方法。它应该是公共的,并对空值进行一些检查。

方法2:

使用接口委托。创建一个界面:

 public interface TaskListener {
        void onComplete();
    } 

执行时将其传递给AsyncTask,如:

new MyAsyncTask(params, params, new TaskListener() {

    @Override
    public void onComplete () {

        // call setNewSetting from within SettingsActivity
    }

}).execute();

你在AsyncTask构造函数中得到它:

public MyAsyncTask (String params, String param2, TaskListener taskListenerDelegate) {

    this.taskListenerDelegate = taskListenerDelegate;
}

onComplete()中调用onPostExecute()

taskListenerDelegate.onComplete();

方法3

不推荐,但您也可以尝试使用startActivityForResult()。并且,在onActivityResult()中收听以应用更改。