BottomSheetDialog / BottomSheetDialogFragment - 使用哪个以及如何使用?

问题描述 投票:18回答:1

我正在开发一个Material Design应用程序。我想实现的一个功能是某种民意调查。当用户单击列表的元素时,应显示如下所示的持久性底部工作表对话框:

Persistent bottom sheet dialog with question and three buttons.

然后,当用户单击任何按钮时,此对话框应该消失,并且应显示模式底部工作表对话框,为用户提供有关在开头单击的列表项的更多信息。它看起来像这样:

A modal bottom sheet dialog which shows up after one of the buttons is clicked

我找不到有关BottomSheetDialog和BottomSheetDialogFragment的任何明确解释,以及如何正确使用它们,即使在阅读有关AppCompat对话框的一些信息之后也是如此。所以,我的问题是:

  1. 它们以什么方式不同,我应该为每个案例使用哪一个?
  2. 如何获取关于在对话框中按下哪个按钮的活动中的数据?
  3. 有关使用它们的实现代码或教程的任何链接?
android android-fragments dialog modal-dialog bottom-sheet
1个回答
11
投票

最后,我找到了解决方案并且有效。告诉我,如果我做错了什么。它基本上像this guide的DialogFragment,但我做的有点不同。

1)它们的区别与DialogFragment和Dialog相同,它们都是模态的。如果你需要持久对话,请使用BottomSheetBehaviour instead(我发现两个对话框都必须在我的应用程序中是模态的)。

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)要在活动或任何其他地方获取输入事件,请使用必要的方法定义接口并为其实例创建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上找到。

© www.soinside.com 2019 - 2024. All rights reserved.