5

J'ai un paramètre Nom de magasin, en changeant le nom, il doit d'abord l'envoyer à mon serveur et s'il est stocké avec succès dans le serveur, alors il doit définir dans le résumé de mon EditTextPreference. Tout fonctionne bien, mais à la fin je ne peux pas toucher le EditTextPreference pour définir le nom dessus.Comment modifier EditTextPrefences d'une autre activité ou d'un autre thread

cette méthode est l'activité de réglage, mais appelé à partir onPostExecute du 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); 
} 

l'activité est l'activité de réglage que je suis passé à la AsyncTask, puis transmis à la méthode.

mon problème est ici et me donner un nullPoiterException pour EditTextPreferences

Désolé pour mon mauvais anglais. et merci d'avance.

Répondre

2

Méthode 1:

Si l'activité est toujours en arrière-plan, passez votre context-AsyncTask et créer une instance de votre activité Paramètres.

SettingsActivity settingsActivity = (SettingsActivity) context; 

alors, appelez la méthode dans onPostExecute()

settingsActivity.setNewSetting(); 

Et, demandez à votre méthode setNewSetting() dans votre SettingsActivity. Il devrait être public et mettre des vérifications pour les valeurs nulles.

Méthode 2:

Utiliser un délégué d'interface. Créer une interface:

public interface TaskListener { 
     void onComplete(); 
    } 

passer à AsyncTask lorsque vous l'exécuter, quelque chose comme:

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

    @Override 
    public void onComplete() { 

     // call setNewSetting from within SettingsActivity 
    } 

}).execute(); 

Vous obtenez dans votre AsyncTask constructer:

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

    this.taskListenerDelegate = taskListenerDelegate; 
} 

Appelez son onComplete() dans onPostExecute() :

taskListenerDelegate.onComplete(); 

Méthode 3

Non recommandé, mais vous pouvez essayer avec startActivityForResult() aussi. Et, écoutez onActivityResult() pour appliquer les modifications.

+1

merci beaucoup. J'ai essayé la première méthode et ça marche bien. Je vais essayer d'autres méthodes aussi. tu as sauvé mon temps. merci beaucoup –

+0

que diriez-vous de votre troisième méthode? Avec asynTask, nous n'avons pas l'intention d'utiliser startAcrivityForResult, alors comment pouvons-nous utiliser? @rupinderjeet –

+1

qui entrerait en jeu si vous utilisiez une activité à la place de AsyncTask. Vous utiliserez une activité avec des gestionnaires d'arrière-plan. Mais, sérieusement, ne faites pas cela, c'est sale et plus de douleur. – rupinderjeet