使用DialogFragment遇到的一些问题
16lz
2021-01-26
使用DialogFragment可以任意实现以下两个方法:
1、onCreateView
2、onCreateDialog
但是当需要创建一个宽度撑满屏幕或者位于屏幕底部的Dialog时,使用onCreateView无法满足需求,创建的Dialog总是离屏幕边缘或者底部有一点间距;这时必须通过onCreateDialog来实现。
View view = LayoutInflater.from(activity).inflate(R.layout.xxx, null);AlertDialog dialog = new AlertDialog.Builder(activity, R.style.ShareDialogTheme).setView(view).create();
不过在onCreateDialog中,也需要注意:
1、需要给dialog指定一个样式,否则会使用默认的样式,还是无法撑满屏幕。
2、使用setView,而不是使用dialog的setContentView,如果使用后者,在父类的onStart里会调用AlertDialog的onCreate,最终会调用requestWindowFeature,就会抛异常“requestWindowFeature必须在setContentView前调用”。
3、在onStart里去改变Dialog的位置和大小,在onCreateDialog里无效。
@Override public void onStart() { super.onStart(); Window window = getDialog().getWindow(); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(wlp); }
还有一种方法是直接new一个Dialog:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity(), R.style.ShareDialogTheme); dialog.setContentView(R.layout.xxx); Window window = dialog.getWindow(); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(wlp); return dialog; }
就可以使用setContentView,因为Dialog的onCreate是一个空实现,在DialogFragment的onStart里调用它的时,不会去调requestWindowFeature,也可以直接在onCreateDialog里去改变大小和位置,也是因为这个原因。不过直接new一个Dialog,谷歌并不推荐。
更多相关文章
- Android(安卓)Button setTextColor()参数调用分析
- kotlin技巧和细节整理
- Android(安卓)AIDL实现两个APP间的跨进程通信实例
- Android(安卓)布局单位转换
- 设置自定义ProgressBar样式
- Android(安卓)ViewRootImpl 解析
- 一只不务正业的程序猿玩出个Processing交互库
- android Service相关知识点
- 在Android(安卓)studio中调用python代码