BottomSheetDialog/BottomSheetDialogFragment-что использовать и как?

Я работаю над приложением Material design. Одна из функций, которую я хочу реализовать, - это своего рода опрос. Когда пользователь щелкает элемент списка, диалог постоянного нижнего листа, который выглядит как этой должен появиться. Затем, когда пользователь нажимает любую кнопку, это диалоговое окно должно исчезнуть, и появится диалоговое окно модального нижнего листа, предоставляя пользователю дополнительную информацию о элементе списка, который был нажат в начале. Похоже этой.

Я не могу найти четких объяснений о BottomSheetDialog и BottomSheetDialogFragment и как их правильно использовать, даже после прочтения некоторой информации о диалогах AppCompat. Итак, мои вопросы:

  1. каким образом они отличаются и какой из них я должен использовать для каждого кейс?
  2. как получить данные в активности о том, какая кнопка была нажата в диалоговом окне?
  3. любые ссылки на код реализации или учебники по их использованию?

1 ответов


наконец, я нашел решение и оно работает. Скажи мне, если я делаю что-то не так. Он в основном работает как DialogFragment из данное руководство, но я сделал это немного по-другому.

1) их разница такая же, как у DialogFragment и Dialog, и они оба являются модальными. Если вам нужен постоянный диалог, используйте BottomSheetBehaviour вместо (я узнал, что оба диалога должны быть модальными в моем приложении).

2) я должен ответить на сначала третий вопрос с некоторым кодом, а затем будет легко ответить на второй.

3) создать новый public class, который extends BottomSheetDialogFragment, я назвал его FragmentRandomEventPoll. Здесь необходимо реализовать две вещи.

  • переопределить метод onCreateView. Это почти то же самое, что onCreate метод в действиях, за исключением того, что он возвращает представление, которое он должен раздуть:

    // 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;
    }
    
  • статический метод, который вы можете передайте необходимые данные и получите новый экземпляр этого класса (возможно, я мог бы просто использовать обычный конструктор, мне придется поэкспериментировать с ним немного больше). URandomEventListItem это класс модели данных.

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

2) чтобы получить входные события в activity или любом другом месте, определите интерфейс с необходимыми методами и создайте метод setter для его экземпляра:

private PollButtonClickListener listener;

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

public interface PollButtonClickListener {
    void onAnyButtonClick(Object data)
}

и в том месте, где вы хотите получить свои данные (тег" dialog_event_poll " был указан в макет):

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

если есть что-то неясное, мои файлы проекта можно найти на Github.