2013-08-04 15 views
12

Mam fragment, który składa się z pokrętła i przycisku. Za pomocą pokrętła wybierzesz jedną z czterech opcji, a następnie przycisk przeniesie Cię do następnej czynności.Implementacja wielu detektorów zdarzeń w tym samym fragmencie - Android

Aby zaimplementować spinner muszę zaimplementować onItemSelectedListener w Fragmentie, ale aby użyć przycisku muszę zaimplementować onClickListener. Ale nie mogę zrobić obu ??? Spodziewałbym się, że jest to naprawdę prosta sprawa i potrzeba posiadania wielu różnych detektorów zdarzeń w widoku musi być wspólna, więc jak to zaimplementować?

Oto kod, który używam: -

public class FragmentTypeSelect wystaje fragment narzędzi 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); 
} 

}

Początkowo miałem tylko z tarczy w i dostał ten Dobrze pracować. Następnie próbowałem wstawić funkcję przycisku z zestawem OnClickListener w onCreateView i dodając dodatkowe metody onClick i setUpClickListener. Dokładnie to zrobiłem gdzie indziej, ale w innych przypadkach nie miałem innych zdarzeń do obsłużenia i uczyniłem klasę implementacją onClickListener. Java nie obsługuje wielu narzędzi interfejsu (jak rozumiem) i stąd moje pytanie.

Mam nadzieję, że możesz pomóc. Prawdopodobnie jestem trochę gruby, ale wciąż jestem całkiem nowy dla całego OO, a także dla Androida.

+0

można zrobić jedno i drugie. Opublikuj swój kod i jeszcze bardziej wyjaśnij swój problem. –

+0

Leo, mam już opublikowany kod powyżej .... Dzięki – RobT

Odpowiedz

28

można zrobić:

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

To działało dobrze. Próbowałem tego z małą literą onClickListener zamiast OnClickListener, a kiedy szukałem rozwiązania wszędzie, wydawało mi się, że nie można zaimplementować wielu interfejsów oddzielonych przecinkami. Dziękuję za wyjaśnienie. – RobT

+0

Widziałem również wiele, że w java nie można zaimplementować kilku interfejsów, ale czy jest to dobra praktyka? czy polecasz w ten sposób? – Xsmael

+1

@ Xsmael W Javie możesz implementować wiele interfejsów. I tak, powiedziałbym, że jest to całkowicie dopuszczalna praktyka. Tutaj można również używać anonimowych klas wewnętrznych dla słuchaczy, ale to tylko kwestia stylu kodowania, albo styl jest w porządku w praktyce. –

Powiązane problemy