2016-05-01 2 views
0

J'essaie d'appeler la méthode fragment de la classe java: Je sais qu'il ya beaucoup de questions sur le débordement de la pile sur ce sujet, mais mon cas est différentComment appeler la méthode fragment de la classe java?

ConnectionAsyncTask.java:

import android.app.Activity; 
import android.os.AsyncTask; 

import java.util.List; 

public class ConnectionAsyncTask extends AsyncTask<String,String,String> { 
    Activity activity; 
    private EventListener listener; 

    public ConnectionAsyncTask(Activity activity) { 
     this.activity=activity; 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     String content =HttpManager.getData(params[0]); 
     return content; 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     List<Country> countries= CountryJasonParser.getObjectFromJason(s); 
     if (countries != null) { 
      String s1 = ""; 

       s1=s1+"\n"+"" + countries.get(0).getDes() ; 
     //i want to call DisplyOnTextView(s1) 
     } 
    } 
} 

countryfragment.java:

import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.design.widget.NavigationView; 
    import android.view.LayoutInflater; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ImageButton; 
    import android.widget.ImageView; 
    import android.widget.TextView; 

    public class countryfragment extends android.support.v4.app.Fragment implements NavigationView.OnNavigationItemSelectedListener { 
     TextView desc; 

     public countryfragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      ConnectionAsyncTask connectionAsyncTask = new ConnectionAsyncTask(getActivity()); 
//This is a server which contains data to load it   connectionAsyncTask.execute("http://www.mocky.io/v2/570d3677270000f600dc29b6"); 
      View view = inflater.inflate(R.layout.fragment_countryfragment,container,false); 
      desc = (TextView) view.findViewById(R.id.desc); 

      return view; 
     } 
     public void DisplyOnTextView(String s) { 
      desc.setText(s); 
     } 

     @Override 
     public boolean onNavigationItemSelected(MenuItem item) { 
      return false; 
     } 
    } 

Le résultat doit être: données d'affichage sur affichage de texte.

Répondre

1

essayez ceci:

public class ConnectionAsyncTask extends AsyncTask<String,String,String> { 
    Activity activity; 
    private EventListener listener; 
    private TextView mTextView 

    public ConnectionAsyncTask(Activity activity, TextView txt) { 
     this.activity=activity; 
     this.mTextView=txt; 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     String content =HttpManager.getData(params[0]); 
     return content; 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     List<Country> countries= CountryJasonParser.getObjectFromJason(s); 
     if (countries != null) { 
      String s1 = ""; 

       s1=s1+"\n"+"" + countries.get(0).getDes() ; 

       mTextView.setText(s1); 
     } 
    } 
} 

puis

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 


     View view = inflater.inflate(R.layout.fragment_countryfragment,container,false); 
     desc = (TextView) view.findViewById(R.id.desc); 
     ConnectionAsyncTask connectionAsyncTask = new ConnectionAsyncTask(getActivity(), desc); 
     connectionAsyncTask.execute("http://www.mocky.io/v2/570d3677270000f600dc29b6"); 

     return view; 
    } 
+0

Thanksssss cela fonctionne – Samah

+1

Ce n'est pas la manière idéale pour faire ça. –

1

Vous ne pouvez pas directement mettre à jour votre vue d'interface utilisateur à partir du AsyncTask. Pour votre but, vous pouvez avoir un écouteur afin qu'il déclenche un rappel de fonction dans votre countryfragment.java et à partir de la fonction de rappel, vous pouvez avoir votre TextView mis à jour avec le résultat.

Vous avez déjà une interface comme celle-ci je suppose.

public interface EventListener { 
    public void responseReceiver(String result); 
} 

Maintenant dans votre Fragment mettre en œuvre le EventListener et Override la méthode responseReceiver.

public class countryfragment extends 
    android.support.v4.app.Fragment implements 
    NavigationView.OnNavigationItemSelectedListener 
    , EventListener { 

    // Other code goes here 

    // Override the callback function 
    @Override 
    public void responseReceiver(String result) { 
     DisplyOnTextView(result); 
    } 
} 

Maintenant, lors du démarrage du AsyncTask vous devez passer l'auditeur correct comme ceci:

ConnectionAsyncTask connectionAsyncTask = new ConnectionAsyncTask(getActivity()); 
connectionAsyncTask.listener = this; 
connectionAsyncTask.execute(); 

changer maintenant votre onPostExecute comme ceci:

@Override 
protected void onPostExecute(String s) { 
    List<Country> countries= CountryJasonParser.getObjectFromJason(s); 
    if (countries != null) { 
     String s1 = ""; 

     s1=s1+"\n"+"" + countries.get(0).getDes() ; 
     listener.responseReceiver(s1); 
    } 
} 
+0

I essayé cela avant, à l'aide d'écoute et l'interface utilisateur, remplacer le méthode, mais maintenant j'ai ajouté ce "connectionAsyncTask.listener = this;" mais je reçois une erreur sur l'écouteur – Samah

+0

Quelle est l'erreur? Et avez-vous ajouté la 'EventListener' dans la déclaration de fragment comme celui-ci -' countryfragment public class étend android.support.v4.app.Fragment implémente NavigationView.OnNavigationItemSelectedListener , EventListener ' –

0

il vous suffit d'envoyer un auditeur de l'activité au AsyncTask de l'appeler de onPostExecute

Code

:

public class Task extends AsyncTask<String,String,String> { 

    private TaskListener _listenr; 
    public Task(TaskListener listener) { 
     _listenr = listener; 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     String res = ""; 

     //some logic 

     return res; 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     //some logic 
     if(_listenr!=null) 
     { 
      _listenr.onRetrieveData(s); 
     } 
    } 

    public interface TaskListener 
    { 
     public void onRetrieveData(String res); 
    } 
} 

Fragment: 

    public class countryfragment extends Activity implements TaskListener { 
    TextView desc; 

    public countryfragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     ConnectionAsyncTask connectionAsyncTask = new ConnectionAsyncTask(this); 
//This is a server which contains data to load it   connectionAsyncTask.execute("http://www.mocky.io/v2/570d3677270000f600dc29b6"); 
     View view = inflater.inflate(R.layout.fragment_countryfragment,container,false); 
     desc = (TextView) view.findViewById(R.id.desc); 

     return view; 
    } 
    public void DisplyOnTextView(String s) { 
     desc.setText(s); 
    } 

    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     return false; 
    } 

    @Override 
    public void onRetrieveData(String res) 
    { 
     //some logic here with res 

    } 
} 
0

Malgré l'utilisation AsyncTask n'est pas recommandé pour Les appels HTTP, vous pouvez créer une interface dans votre ConnectionAsyncTask, comme

interface ConnectionAsyncTaskCallback{ 

    void performAction(String s); 
} 

Et ensuite implémenter cette interface dans votre fragment

public class countryfragment extends android.support.v4.app.Fragment implements NavigationView.OnNavigationItemSelectedListener, ConnectionAsyncTask.ConnectionAsyncTaskCallback 

Vous devrez mettre en œuvre la méthode performAction(String s), qui contiendra desc.setText(s);

Enfin, ConnectionAsyncTask ajouter un membre ConnectionAsyncTaskCallback callback; que vous pas dans le constructeur et appelez enfin sur le onPostExecute (callback.performAction(s1);).

TL; DR, ceci est le code modifié:

ConnectionAsyncTask:

public class ConnectionAsyncTask extends AsyncTask<String,String,String> { 
    Activity activity; 
    private EventListener listener; 
    private ConnectionAsyncTaskCallback callback; 

    public ConnectionAsyncTask(Activity activity, ConnectionAsyncTaskCallback callback) { 
     this.activity=activity; 
     this.callback = callback; 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     String content =HttpManager.getData(params[0]); 
     return content; 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     List<Country> countries= CountryJasonParser.getObjectFromJason(s); 
     if (countries != null) { 
      String s1 = ""; 

       s1=s1+"\n"+"" + countries.get(0).getDes() ; 
     //i want to call DisplyOnTextView(s1) 
      callback.performAction(s1); 
     } 

    } 

    interface ConnectionAsyncTaskCallback { 

     void performAction(String s); 
    } 
} 

classe countryfragment:

public class countryfragment extends android.support.v4.app.Fragment implements NavigationView.OnNavigationItemSelectedListener, ConnectionAsyncTask.ConnectionAsyncTaskCallback { 
     TextView desc; 

     public countryfragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      ConnectionAsyncTask connectionAsyncTask = new ConnectionAsyncTask(getActivity()); 
//This is a server which contains data to load it   connectionAsyncTask.execute("http://www.mocky.io/v2/570d3677270000f600dc29b6"); 
      View view = inflater.inflate(R.layout.fragment_countryfragment,container,false); 
      desc = (TextView) view.findViewById(R.id.desc); 

      return view; 
     } 

     @Override 
     public void performAction(String s) { 
      desc.setText(s); 
     } 

     @Override 
     public boolean onNavigationItemSelected(MenuItem item) { 
      return false; 
     } 
}