2017-01-19 3 views
0

je l'listView suivante:Comment appeler la méthode d'activité dans Fragment?

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    //CheckBoxAdapter cb = new CheckBoxAdapter(this.getActivity(),R.layout.item, getResources().getStringArray(R.array.products)); 
    //lv.setAdapter(cb); 
    ArrayAdapter<String> arrayAdapter; 
    arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

    ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
    lv.setAdapter(arrayAdapter); 

    lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

Mais actuellement, je ne peux pas faire référence à AddSubscription qui est nonstatic

MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 

Je dois créer un écouteur non statique qui peut appeler AddSubscription, est-il possible avec un listview ? Si non, puis-je utiliser un autre type de vue?

+1

supprimer MainActivity. , appelez directement AddSubscription (...) la méthode –

+0

Ceci est dans un fragment – Jon

Répondre

0

simplement si votre fragment est placé dans MainActivity faire ceci:

((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
+1

Ne fonctionne pas, d'abord la méthode addubscription est dans la mainactivity, ensuite elle m'a donné l'erreur: "MainActivity n'est pas une classe englobante" – Jon

+0

Cette liste est dans un fragment – Jon

+0

Oh, si dans le fragment, avez-vous essayé d'appeler 'getActivity()'? – Ekalips

0

Je ne voudrais pas utiliser getActivity() et de le jeter car cette approche me semble fragile.

J'ai tapé ceci hors de ma tête sans IDE donc il pourrait y avoir des fautes de frappe. Laissez le Activity implémenter une interface SubscriptionHandler

public interface SubscriptionHandler { 
    public void addSubscription(String identifier); 
} 

Actitiy

public MainActivity extends AppCompatActivity implements SubscriptionHandler { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_id); 
     fragment.setSubscriptionHandler(this); 
    } 

    @Override 
    public void addSubscription(String identifier){ 
    //logic 
    } 

} 

puis l'utiliser dans le fragment

public class MyFragment extends Fragment { 

    @Nullable private SubscriptionHandler subscriptionHandler; 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ArrayAdapter<String> arrayAdapter; 
     arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

     ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
     lv.setAdapter(arrayAdapter); 

     lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         if(subscriptionManager != null) { 
          subscriptionHandler.addSubscription(String.valueOf(parent.getItemAtPosition(position))); 
         } 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

    public void setSubscriptionHandler (SubscriptionHandler subscriptionHandler) { 
     this.subscriptionHandler = subscriptionHandler; 
    } 
} 
+0

Ok merci, savez-vous comment récupérer le fragment? instancier un fragmentmanager et appeler findfragmentbyId ne semble retourner qu'un objet de type fragment, j'ai besoin qu'il soit du même type que le mien. – Jon

+0

L'utilisation de FragmentManager est la bonne approche, il suffit de la lancer de la même manière que pour les boutons et toutes les autres vues. Assurez-vous d'utiliser le bon FragmentManager. J'ai édité la réponse – Altoyyr

+0

Il semble que cette approche renvoie null, j'espère que j'ai ajouté la balise id xml au bon endroit android: id = "@ + id/listFragment" c'est sous le framelayout – Jon

0

Effectuez les opérations suivantes dans l'auditeur:

YourFragmentName.this.((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position)));