onClick l'intérieur appelé fragment sur l'Activité

je suis de l'encapsulation des trucs dans un fragment à l'instant et lancez un problème qui est difficile à google. À l'intérieur de mon fragment se trouvent quelques boutons avec des attributs onClick mais ils sont appelés sur L'activité plutôt le fragment du système android - ce qui rend encapsuler un peu maladroit. Y a-t-il un moyen d'avoir le reflet d'onClick pour appeler le fragment? La seule solution que je vois pour le moment est de ne pas utiliser onClick dans le xml et définir click-listeners dans le fragment code via.

43
demandé sur ligi 2011-09-27 18:11:03

6 réponses

j'ai parlé à certains googlers @ #adl2011 - ils reconnaître le problème et il y aura peut-être une solution à l'avenir. En attendant - on devrait utiliser .setOnClick dans le Fragment.

58
répondu ligi 2011-10-18 13:45:02

le problème est que lorsque les mises en page sont gonflées, c'est toujours l'activité d'hébergement qui reçoit les clics de Bouton, pas les Fragments individuels.

je préfère utiliser la solution suivante pour gérer les événements onClick. Cela fonctionne pour L'activité et les Fragments aussi bien.

public class StartFragment extends Fragment implements OnClickListener{

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

        View v = inflater.inflate(R.layout.fragment_start, container, false);

        Button b = (Button) v.findViewById(R.id.StartButton);
        b.setOnClickListener(this);
        return v;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.StartButton:

            ...

            break;
        }
    }
}

alors le problème est parti.

8
répondu Xar E Ahmer 2014-12-04 08:57:07

Cela fonctionne pour moi

Ajouter d'importation:

    import android.view.View.OnClickListener;

Fragment.java

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

       rootView = (ViewGroup) inflater.inflate(R.layout.fragment, container, false);

       Button mButton = (Button) rootView.findViewById(R.id.button);
       mButton.setOnClickListener(new OnClickListener() {
          public void onClick(View v) {

          }
       });
       return rootView;
    }
5
répondu Alex 2013-08-01 10:50:48

ISSUE:

1.Dans XML onClick attribut appellera méthode publique de l'activité.

2.La méthode publique de Fragment n'est pas appelée.

3.Réutilisabilité des fragments.

SOLUTION:

layout de Fragment ajouter à la Vue.

android:onClick="onFragmentViewClick"

Dans chaque activité le fragment appartient..

public void onFragmentViewClick(View v) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);
    if (fragment != null && fragment.isVisible()) {
        if (fragment instanceof SomeFragment) {
            ((SomeFragment) fragment).onViewClicked(v);
        }
    }
}

Dans le Fragment incluez ceci méthode..

public void onViewClicked(View v) {
    switch (v.getId()) {
        case R.id.view_id:
            Log.e("onViewClicked", "yehhh!!");
            break;
    }
}
2
répondu Sjd 2015-12-23 16:27:10

Vous pourriez avoir l'auditeur qui est appelée dans l'activité de transférer l'appel sur un écouteur dans le fragment. Vous devriez avoir une référence au fragment à l'intérieur de L'activité de fragment pour passer l'appel. Vous devrez lancer pour appeler la méthode ou demander à votre fragment d'implémenter une interface que vous définirez. Je sais que ce n'est pas la meilleure solution mais il faudra travailler. Vous pouvez également utiliser le tag d'un bouton pour spécifier le nom de la méthode à appeler si vous le souhaitez. Espérons que cela aide un peu.

0
répondu Bobbake4 2011-09-27 14:36:11

Essayez ceci...

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView =  inflater.inflate(R.layout.activity_ipadditional_users, container, false);

    FloatingActionButton button7 = (FloatingActionButton) rootView.findViewById(R.id.fab_ip_additional_user);
    button7.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getActivity(), IPAdditionalUsersEdit.class);
            startActivity(intent);
        }
    });

    return rootView;
0
répondu A.G.THAMAYS 2016-07-29 09:12:41