BottomSheetDialog/BottomSheetDialogFragment-что использовать и как?
Я работаю над приложением Material design. Одна из функций, которую я хочу реализовать, - это своего рода опрос. Когда пользователь щелкает элемент списка, диалог постоянного нижнего листа, который выглядит как этой должен появиться. Затем, когда пользователь нажимает любую кнопку, это диалоговое окно должно исчезнуть, и появится диалоговое окно модального нижнего листа, предоставляя пользователю дополнительную информацию о элементе списка, который был нажат в начале. Похоже этой.
Я не могу найти четких объяснений о BottomSheetDialog и BottomSheetDialogFragment и как их правильно использовать, даже после прочтения некоторой информации о диалогах AppCompat. Итак, мои вопросы:
- каким образом они отличаются и какой из них я должен использовать для каждого кейс?
- как получить данные в активности о том, какая кнопка была нажата в диалоговом окне?
- любые ссылки на код реализации или учебники по их использованию?
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.