3

J'essaie de définir/remplacer la méthode onclick pour un bouton (R.id.buy_button) dans l'une de mes vues (à l'intérieur d'un fragment). L'application ne renvoie pas d'erreurs. Cependant, il ne déclenche pas la méthode onclick. Je ne suis pas sûr si ma mise en œuvre est incorrecte ou peut-être que mon bouton est mal configuré. Toute aide/commentaires/conseils serait appréciée.Le bouton onclick inside fragment ne fonctionne pas

Mon onCreateView est ici:

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

    View view = inflater.inflate(R.layout.list_item, container, false); 
    Button b = (Button) view.findViewById(R.id.buy_button); 
    b.setOnClickListener(this); 

    return inflater.inflate(R.layout.fragment_item_list, container, false); 
} 

Tout mon code fragment:

public static class AlbumsFragment extends ListFragment implements View.OnClickListener { 
     private static final String ARG_SECTION_NUMBER = "section_number"; 

     public AlbumsFragment() { 
     } 

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

     @Override 
     public void onActivityCreated(Bundle b){ 
      super.onActivityCreated(b); 

      ListView listView = getListView(); 
      List<Album> albums = null; 

      albums = Album.listAll(Album.class); 
      Log.i("ALBUMS", albums.toString()); 
      ArrayAdapter<Album> adapter = 
        new ArrayAdapter<Album>(getActivity(), R.layout.list_item, R.id.textView, albums); 
      if (!albums.equals("")) { 
       listView.setAdapter(adapter); 
      } 
     } 

     @Override 
     public void onAttach(Activity activity) { 
      super.onAttach(activity); 
      ((MainActivity) activity).onSectionAttached(
        getArguments().getInt(ARG_SECTION_NUMBER)); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
     } 

     @Override 
     public void onDetach() { 
      super.onDetach(); 
     } 

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

      View view = inflater.inflate(R.layout.list_item, container, false); 
      Button b = (Button) view.findViewById(R.id.buy_button); 
      b.setOnClickListener(this); 

      return inflater.inflate(R.layout.fragment_item_list, container, false); 
     } 

     public void gotoPurchaseWeb() { 
      Context context = getActivity().getApplicationContext(); 
      Intent intent = new Intent(context, PurchaseSong.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(intent); 
     } 

     public static AlbumsFragment newInstance(int sectionNumber) { 
      AlbumsFragment fragment = new AlbumsFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 

      return fragment; 
     } 

     @Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
       case R.id.buy_button: 
        Context context = getActivity().getApplicationContext(); 
        Intent intent = new Intent(context, PurchaseSong.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intent); 
        break; 
      } 
     } 
    } 

Mon list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <!-- ListRow Left sied Thumbnail image --> 
    <LinearLayout android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="3dip" 
     android:layout_alignParentLeft="true" 
     android:layout_marginRight="5dip" 
     android:weightSum="1" 
     android:showDividers="middle|end" 
     android:visibility="visible"> 

     <ImageView 
      android:id="@+id/list_image" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:src="@drawable/black"/> 

     <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/textView" 
      android:layout_width="@dimen/navigation_drawer_width" 
      android:layout_height="wrap_content" 
      android:textSize="16sp" 
      android:layout_marginTop="@dimen/zero_space" 
      android:layout_marginBottom="@dimen/zero_space" 
      android:paddingTop="3dp" 
      android:paddingLeft="8dp" 
      android:paddingRight="5dp" 
      android:paddingBottom="0dp" 
      android:layout_weight="24.33" /> 

    </LinearLayout> 

    <Button 
     style="@style/ButtonText" 
     android:layout_width="wrap_content" 
     android:layout_height="@dimen/button_height" 
     android:text="@string/buy_album" 
     android:id="@+id/buy_button" 
     android:background="@drawable/blue_button" 
     android:paddingTop="7dp" 
     android:layout_centerVertical="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginRight="10dp" /> 

Mon ensemble du projet: https://github.com/markbratanov/MyFitPlayer/tree/master/Player/src/main/java/com/markbratanov/myfitplayer

Toute aide serait appréciée. Merci.

Répondre

6

Vous devez retourner votre vue au lieu de renvoyer une nouvelle instance gonflée de votre vue dans la fonction de rappel onCreateView à l'intérieur de votre fragment.

return inflater.inflate(R.layout.fragment_item_list, container, false); 

utiliser:

return view; 
+1

Vous pouvez créer une vue de vue sans assigner un écouteur OnClick au bouton – user3455363

+0

@ user3455363: absolument –

+0

@Arash Cela a du sens. Je l'ai essayé et renvoie une exception NullPointerException. Le bouton se trouve dans un fichier de mise en page différent (list_item) que la vue du fragment (fragment_item_list). Comment puis-je charger les deux? – markbratanov

-1

J'ai eu le même problème. Mon écouteur du bouton onclick ne fonctionnait pas à l'intérieur du fragment.

Essayez ceci: ajoutez le android: onclick = « » à l'intérieur du XML bouton avant la balise de fermeture et de créer une classe dans le fichier mainActivity.java ayant le même nom que le nom de la classe que vous avez déclaré à l'intérieur du XML. Ensuite, faites ce que vous voulez faire dans l'événement onclick. Écrivez-le dans la classe que vous avez créée récemment pour l'événement click.