web-dev-qa-db-fra.com

Implémentez plusieurs écouteurs d'événements dans le même fragment - Android

J'ai un fragment qui se compose d'une fileuse et d'un bouton. Vous sélectionnez l'une des quatre options avec le spinner, puis le bouton vous amènera à l'activité suivante.

Afin d'implémenter le spinner, j'ai besoin d'implémenter onItemSelectedListener sur le fragment, mais pour utiliser le bouton, j'ai besoin d'implémenter onClickListener. Mais je ne peux pas faire les deux ??? Je m'attendais à ce que ce soit une chose très simple et la nécessité d'avoir plusieurs écouteurs d'événements différents sur une vue doit être courante, alors comment implémentez-vous cela?

Voici le code que j'utilise: -

public class FragmentTypeSelect étend Fragment implémente OnItemSelectedListener {

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

    // set the view so that it can be referenced
    View theView = inflater.inflate(R.layout.fragment_type_select, 
            container,false);

    // set OnClickListener for the button
    setUpClickListener(theView,R.id.but_select);


    //===============================
    // NEW TYPE SPINNER
    //===============================

    Spinner spinner = (Spinner) theView.findViewById(R.id.new_type_spinner);
    spinner.setOnItemSelectedListener((OnItemSelectedListener) this);

    // Create an ArrayAdapter using the string array and a default spinner layout
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
            R.array.types_array, Android.R.layout.simple_spinner_item);

    // Specify the layout to use when the list of choices appears
    adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

    // Apply the adapter to the spinner
    spinner.setAdapter(adapter);

    return theView;

}

public void onItemSelected(AdapterView<?> parent, View view,
        int pos, long id)
{

    TextView headingText = (TextView)getView().findViewById(R.id.new_diet_type_text_heading);
    TextView detailText = (TextView)getView().findViewById(R.id.new_diet_type_text_detail);

    if (pos == 0)   
    {
        headingText.setText(R.string.heading_type_1);
        detailText.setText(R.string.detail_type_1);
    }
    if (pos == 1)   
    {
        headingText.setText(R.string.heading_type_2);
        detailText.setText(R.string.detail_type_2);
    }
    if (pos == 2)
    {
        headingText.setText(R.string.heading_type_3);
        detailText.setText(R.string.detail_type_3);
    }
    if (pos == 3) 
    {
        headingText.setText(R.string.heading_type_4);
        detailText.setText(R.string.detail_type_4);
    }

}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

}



public void onClick(View view){

    Toast.makeText(getActivity(), "Clicked", Toast.LENGTH_LONG).show();
}

private void setUpClickListener(View theView, int childViewID) {
    View childView = theView.findViewById(childViewID);
    childView.setOnClickListener((OnClickListener) this);
}

}

À l'origine, je venais d'avoir le spinner et ça fonctionnait bien. J'ai ensuite essayé de mettre la fonction bouton avec l'ensemble OnClickListener dans onCreateView et en ajoutant les méthodes supplémentaires onClick et setUpClickListener. C'est exactement comment je l'ai fait ailleurs, mais dans d'autres cas, je n'ai pas eu d'autres événements à gérer et j'ai fait en sorte que la classe implémente onClickListener. Java ne prend pas en charge plusieurs outils d'interface (si je comprends bien) et donc ma question.

J'espère que vous pourrez aider. Je suis probablement un peu épais mais je suis encore assez nouveau dans l'ensemble OO ainsi qu'Android.

13
RobT

Tu peux faire:

public class FragmentTypeSelect extends Fragment 
        implements OnItemSelectedListener, OnClickListener {
35
Leo Landau
   public class Home extends AppCompatActivity  implements ImageAdapter.OnItemClickListener ,Filterable {

puis cliquez sur l'ampoule rouge et appliquez la méthode. l'implémentation de plus d'une interface peut être effectuée en séparant les interfaces par une virgule.

0
Malak