2016-04-19 11 views
10

Pracuję nad aplikacją Material Design. Jedną z funkcji, którą chcę zaimplementować, jest rodzaj ankiety. Gdy użytkownik kliknie element listy, powinno pojawić się trwałe okno dialogowe z dolnym arkuszem, które wygląda jak this. Następnie, gdy użytkownik kliknie dowolny przycisk, to okno dialogowe powinno zniknąć, a modalne okno dolne powinno się wyświetlić, zapewniając użytkownikowi więcej informacji o pozycji na liście, która została kliknięta na początku. Wygląda na to, że this.BottomSheetDialog/BottomSheetDialogFragment - którego użyć i jak?

Nie mogę znaleźć żadnych jasnych wyjaśnień na temat BottomSheetDialog i BottomSheetDialogFragment i jak z nich korzystać poprawnie, nawet po przeczytaniu niektórych informacji o oknach dialogowych AppCompat. Tak więc, moje pytania są następujące:

  1. W jaki sposób są one różne i które należy użyć do każdego przypadku ?
  2. Jak uzyskać dane w działaniu, który przycisk został naciśnięty w oknie dialogowym?
  3. Wszelkie linki do kodu implementacji lub samouczki dotyczące ich używania?

Odpowiedz

6

Wreszcie znalazłem rozwiązanie i działa. Powiedz mi, jeśli coś robię źle. Zasadniczo działa jak DialogFragment z this guide, ale zrobiłem to trochę inaczej.

1) Ich różnica jest taka sama jak w DialogFragment i Dialog, a obie są modalne. Jeśli potrzebujesz trwałego okna dialogowego, użyj BottomSheetBehaviour instead (okazało się, że oba okna dialogowe musiały być modalne w mojej aplikacji).

2) Najpierw muszę odpowiedzieć na trzecie pytanie za pomocą jakiegoś kodu, a następnie łatwo odpowiem na drugie pytanie.

3) Utwórz nowy public class, który został oznaczony jako FragmentRandomEventPoll. Są tu dwie rzeczy, które należy wdrożyć tutaj.

  • Metoda przesłaniania onCreateView. To jest prawie taki sam jak onCreate sposób w działaniach, z wyjątkiem tego, że zwraca widoku należy nadmuchać:

    // We will need it later 
    private static String headerItem; 
    
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    
    View v = inflater.inflate(R.layout.fragment_random_event_poll, container, false); 
        header = (TextView) v.findViewById(R.id.uRnd_fragment_bottom_sheet_poll_header); 
        skip = (Button) v.findViewById(R.id.uRnd_fragment_bottom_sheet_button_skip); 
        header.setText(...); 
    
        // I implemented View.OnClickListener interface in my class 
        skip.setOnClickListener(this); 
        return v; 
    } 
    
  • statyczna metoda, którą można przekazać niezbędne dane i uzyskać nową instancję tej klasy (Prawdopodobnie mógłbym użyłem zwykłego konstruktora, będę musiał poeksperymentować z tym nieco więcej). URandomEventListItem to klasa modelu danych.

    public static FragmentRandomEventPoll newInstance(URandomEventListItem item) { 
        FragmentRandomEventPoll fragment = new FragmentRandomEventPoll(); 
        headerItem = item.getHeader(); 
        return fragment; 
    } 
    

2) Aby uzyskać zdarzeń wejściowych w działalności lub jakimkolwiek innym miejscu, zdefiniować interfejs z niezbędnymi metodami i stworzyć metody setter na to instancja:

private PollButtonClickListener listener; 

public void setListener(PollButtonClickListener listener) { 
    this.listener = listener; 
} 

public interface PollButtonClickListener { 
    void onAnyButtonClick(Object data) 
} 

A w miejscu, gdzie chcemy aby uzyskać dane („dialog_event_poll” tag został określony w układzie):

FragmentRandomEventPoll poll = FragmentRandomEventPoll.newInstance(events.get(id)); 
poll.setListener(new FragmentRandomEventPoll.PollButtonClickListener() { 
     @Override 
     public void onAnyButtonClick(Object data) { 
      // Do what you want with your data 
     } 
    }); 
    poll.show(getSupportFragmentManager(), "dialog_event_poll"); 
} 

Jeśli jest coś wujek ar, moje pliki projektów można znaleźć na Github.

Powiązane problemy