2013-08-04 5 views
12

Ich habe ein Fragment, das aus einem Drehfeld und einer Schaltfläche besteht. Sie wählen mit dem Drehfeld eine von vier Optionen aus und die Schaltfläche führt Sie zur nächsten Aktivität.Implementieren Sie mehrere Ereignislistener im selben Fragment - Android

Um den Spinner zu implementieren, muss ich onItemSelectedListener auf dem Fragment implementieren, aber die Schaltfläche zu verwenden, die onClickListener implementieren muss. Aber ich kann nicht beides tun ??? Ich hätte erwartet, dass dies eine sehr einfache Sache ist und die Notwendigkeit, mehrere verschiedene Event-Listener auf einer View zu haben, muss üblich sein, also wie implementieren Sie das? Hier

ist der Code, den ich verwende: -

public class FragmentTypeSelect Fragment erstreckt implementiert 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); 
} 

}

Ursprünglich hatte ich nur den Spinner in und bekam diese funktioniert gut. Ich habe dann versucht, die Button-Funktion mit dem Set OnClickListener in der onCreateView einzufügen und die zusätzlichen onClick- und setUpClickListener-Methoden hinzuzufügen. Dies ist genau, wie ich es anderswo gemacht habe, aber in anderen Fällen hatte ich nicht andere Ereignisse zu handhaben und hat die Klasse den onClickListener implementieren lassen. Java unterstützt keine Multiple-Interface-Implementierungen (wie ich es verstehe) und daher meine Frage.

Ich hoffe, Sie können helfen. Ich bin wahrscheinlich ein bisschen dick, aber ich bin immer noch ziemlich neu in der ganzen OO sowie Android.

+0

Sie beide tun können. Veröffentlichen Sie Ihren Code und erklären Sie Ihr Problem bitte weiter. –

+0

Leo, ich habe jetzt den obigen Code geschrieben .... Danke – RobT

Antwort

28

können Sie tun:

public class FragmentTypeSelect extends Fragment 
     implements OnItemSelectedListener, OnClickListener { 
+0

Das hat gut funktioniert. Ich hatte dies mit einem Kleinbuchstaben onClickListener anstatt OnClickListener versucht und dann, als ich nach einer Lösung suchte, schien überall zu sagen, dass Sie nicht mehrere Schnittstellen implementieren konnten, die durch Kommas getrennt sind. Danke für die Klarstellung. – RobT

+0

Ich habe auch viel gesehen, dass es in Java nicht möglich ist, mehrere Schnittstellen zu implementieren, aber ist das eine gute Übung? Empfiehlst du diesen Weg? – Xsmael

+1

@Xsmael In Java dürfen Sie mehrere Schnittstellen implementieren. Und ja, ich würde sagen, dass dies eine vollkommen akzeptable Praxis ist. Hier könnten Sie auch anonyme innere Klassen für die Listener verwenden, aber das ist nur eine Frage des Codestils, entweder ist Stil in der Praxis in Ordnung. –