2016-04-19 19 views
10

Sto lavorando a un'app di progettazione materiale. Una caratteristica che voglio implementare è una sorta di sondaggio. Quando un utente fa clic su un elemento di un elenco, dovrebbe apparire la finestra di dialogo permanente del foglio di fondo, che assomiglia a this. Quindi, quando l'utente fa clic su qualsiasi pulsante, questa finestra di dialogo dovrebbe scomparire e dovrebbe apparire la finestra di dialogo modale sul lato inferiore, fornendo all'utente ulteriori informazioni sulla voce dell'elenco su cui è stato fatto clic all'inizio. Sembra this.BottomSheetDialog/BottomSheetDialogFragment - quale usare e come?

Non riesco a trovare alcuna spiegazione chiara su BottomSheetDialog e BottomSheetDialogFragment e su come utilizzarli correttamente, anche dopo aver letto alcune informazioni sulle finestre di dialogo AppCompat. Quindi, le mie domande sono:

  1. In che modo sono diversi e quale dovrei usare per ogni caso ?
  2. Come ottenere dati nell'attività su quale pulsante è stato premuto nella finestra di dialogo?
  3. Eventuali collegamenti al codice di implementazioni o tutorial sull'utilizzo di essi?

risposta

6

Infine, ho trovato la soluzione e funziona. Dimmi se sto facendo qualcosa di sbagliato. Funziona fondamentalmente come DialogFragment da this guide, ma l'ho fatto un po 'diverso.

1) La loro differenza è la stessa di DialogFragment e Dialog, ed entrambi sono modali. Se hai bisogno di una finestra di dialogo persistente, usa BottomSheetBehaviour instead (ho scoperto che entrambe le finestre di dialogo dovevano essere modali nella mia app).

2) Devo prima rispondere alla terza domanda con un po 'di codice, quindi sarà facile rispondere alla seconda.

3) Creare un nuovo public class, che extends BottomSheetDialogFragment, l'ho chiamato FragmentRandomEventPoll. Ci sono due due cose che devono essere implementate qui.

  • Metodo di override onCreateView. E 'quasi la stessa onCreate metodo Attività, tranne che restituisce la vista dovrebbe gonfiare:

    // 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; 
    } 
    
  • Metodo statico che è possibile passare i dati necessari per e ottenere nuova istanza di questa classe (Probabilmente ho potuto ho appena usato un costruttore regolare, dovrò sperimentarlo un po 'di più). URandomEventListItem è la classe del modello di dati.

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

2) Per ottenere eventi di input in attività o in qualsiasi altro luogo, definire un'interfaccia con metodi necessari e creare metodo setter per la sua esempio:

private PollButtonClickListener listener; 

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

public interface PollButtonClickListener { 
    void onAnyButtonClick(Object data) 
} 

E nel luogo che si desidera per ottenere i dati (tag "dialog_event_poll" è stato specificato nel layout):

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"); 
} 

Se c'è qualcosa che lo zio ar, i miei file di progetto possono essere trovati su Github.