Android开发 DialogFragment对话框详解
<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1><p><span style="color: rgba(0, 0, 0, 1)"> 在聊<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">DialogFragment</span></span></span></span>之前,我们看看以往我们在Android里实现一个对话框一般有这几种方式:</span></p>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)"><strong> Dialog</strong> 继承重写<span style="color: rgba(0, 0, 0, 1)">Dialog</span>实现一个自定义的Dialog</span></li>
<li><span style="color: rgba(0, 0, 0, 1)"><strong> AlertDialog</strong> Android原生提供的对话框(底层是继承<span style="color: rgba(0, 0, 0, 1)">Dialog</span>实现)</span></li>
<li><span style="color: rgba(0, 0, 0, 1)"><strong> </strong><span class="entrylistItemTitle"><strong>PopupWindow</strong> 用弹出悬浮框,实现对话框。这种对话框可以用在指定位置显示,一般用于一些非常小的按键弹窗。怎么实现可以参考我的博客:https://www.cnblogs.com/guanxinjing/p/10156153.html</span></span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"> 这3种弹窗对话框都有一个问题,就是与activity的生命周期不是捆绑的,得时刻注意在activity后台之后关闭Dialog。所以,<span style="color: rgba(186, 55, 42, 1)"><strong>后面google推荐使用DialogFragment来取代它们</strong></span>。<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">DialogFragment</span></span>本质其实是<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">Fragment</span></span></span></span>,有<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">Fragment</span></span></span></span>的生命周期并且与创建它的activity有捆绑。</span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"> 在google推出了Jetpack系列后,DialogFragment配合<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">Jetpack系列</span></span>的ViewModel、</span></span><span class="entrylistItemTitle" style="color: rgba(0, 0, 0, 1)">LiveData</span><span class="entrylistItemTitle">与Navigation在使用上比一般的Dialog更加安全。并且在数据传递上也非常简单,配合N<span class="entrylistItemTitle">avigation</span>架构管理起来也十分简单明晰。如果你未接触过不了解Navigation<span style="color: rgba(0, 0, 0, 1)">,可以我的</span>参考博客:<span role="heading" aria-level="2">Android开发 navigation入门详解</span></span></p>
<p><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"> 下面我们就根据2个最简单demo和与一些使用特例,来介绍<span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle">DialogFragment的使用。</span></span></span></span></span></span></span></span></p>
<h1><span style="color: rgba(0, 128, 128, 1)">以<strong>Dialog</strong>创建<span class="entrylistItemTitle"><span class="entrylistItemTitle">DialogFragment的简单Demo</span></span></span></h1>
<p><span class="entrylistItemTitle"><span class="entrylistItemTitle"> <span class="entrylistItemTitle"><span class="entrylistItemTitle">DialogFragment</span></span>有2种方法创建我们需要的对话框内容,其中就有以Dialog来创建内容方式。</span></span></p>
<p><strong><span class="entrylistItemTitle"><span class="entrylistItemTitle">继承重写<span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span class="entrylistItemTitle">DialogFragment:</span></span></span></span></span><span class="entrylistItemTitle"><span class="entrylistItemTitle"><span style="color: rgba(0, 0, 0, 1)"><span class="entrylistItemTitle"><span class="entrylistItemTitle"> </span></span></span></span></span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog1 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {
@NonNull
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建对话框,我们需要返回dialog</span>
AlertDialog.Builder dialog = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AlertDialog.Builder(getContext());
dialog.setTitle(</span>"测试Dialog"<span style="color: rgba(0, 0, 0, 1)">);
dialog.setMessage(</span>"DialogFragment"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> dialog.create();
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此方法在视图已经创建后返回的,但是这个view 还没有添加到父级中,我们在这里可以重新设定view的各个数据</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}</span></pre>
</div>
<p><strong>在activity里显示对话框:</strong></p>
<p>这里的show传入的是activity的getSupportFragmentManager(),这因为DialogFragment本质上是Fragment,它需要通过Activity的FragmentManager进行管理。此外这里的第二个参数tag,其实也是用于管理Fragment的tag。</p>
<div class="cnblogs_code">
<pre> mBtnTest.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
myDialog </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyDialog1();
myDialog.show(getSupportFragmentManager(),</span>"myDialog"<span style="color: rgba(0, 0, 0, 1)">);
}
});</span></pre>
</div>
<p>效果图:</p>
<p><img src="https://img2018.cnblogs.com/common/1497956/201912/1497956-20191215190439927-977903746.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">以<strong>布局View</strong>创建<span class="entrylistItemTitle"><span class="entrylistItemTitle">DialogFragment的简单Demo</span></span></span></h1>
<p> <span class="entrylistItemTitle"><span class="entrylistItemTitle"><span class="entrylistItemTitle"><span class="entrylistItemTitle">DialogFragment另一种创建内容方法,导入一个View</span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {
@Nullable
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view </span>= inflater.inflate(R.layout.set_wifi_password_dialog_layout, container, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> view;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onViewCreated(@NonNull <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> View view, @Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
此方法在视图View已经创建后返回的,但是这个view 还没有添加到父级中。
我们在这里可以重新设定view的各个数据,但是不能修改对话框最外层的ViewGroup的布局参数。
因为这里的view还没添加到父级中,我们需要在下面<span style="color: rgba(0, 128, 0, 1)">onStart生命周期里修改对话框尺寸参数</span>
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
因为View在添加后,对话框最外层的ViewGroup并不知道我们导入的View所需要的的宽度。 所以我们需要在onStart生命周期里修改对话框尺寸参数
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
getDialog().getWindow().setAttributes((WindowManager.LayoutParams) params);
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}
}</span></pre>
</div>
<p>显示对话框的代码跟上面的demo一样,就不重复贴出来了,看看效果图:</p>
<p><img src="https://img2018.cnblogs.com/common/1497956/201912/1497956-20191215193921511-84759479.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">设置对话框在屏幕中的显示位置</span></h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog2 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {
@Nullable
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view </span>= inflater.inflate(R.layout.set_wifi_password_dialog_layout, container, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> view;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onViewCreated(@NonNull <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> View view, @Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
params.gravity </span>= Gravity.BOTTOM; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将对话框放到布局下面,也就是屏幕下方</span>
<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().setAttributes((WindowManager.LayoutParams) params);
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}
}</span></pre>
</div>
<p>效果图:</p>
<p><img src="https://img2018.cnblogs.com/common/1497956/201912/1497956-20191215194815549-121940100.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">将对话框的宽或者高铺满屏幕</span></h1>
<p><strong><span style="color: rgba(0, 0, 0, 1)">设置对话框铺满屏幕有2种方式:</span></strong></p>
<p><strong><span style="color: rgba(0, 0, 0, 1)">第一种 需要在styles.xml文件里,添加一个没有内边距的<span style="color: rgba(0, 0, 0, 1)">style,如下</span>:</span></strong></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 在上面的出现在屏幕下方的对话框中,依然与屏幕有小段距离,那个其实是dialog自带的padding内边距属性导致的。这种方式可以设置只在宽度上铺满屏幕,但是高度上依然留有一定的内边距。</span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="dialogFullScreen"</span><span style="color: rgba(255, 0, 0, 1)"> parent</span><span style="color: rgba(0, 0, 255, 1)">="Theme.AppCompat.Dialog"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorPrimary"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorPrimary<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorPrimaryDark"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorPrimaryDark<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorAccent"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorAccent<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:padding"</span><span style="color: rgba(0, 0, 255, 1)">></span>0dp<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:windowBackground"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/white<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:textColor"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/black<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong><span style="color: rgba(0, 0, 0, 1)">第二种 <strong><span style="color: rgba(0, 0, 0, 1)">需要在styles.xml文件里,</span></strong></span><strong>设置</strong> <span style="color: rgba(0, 128, 0, 1); font-weight: bold"><span style="color: rgba(0, 0, 0, 1)">android:windowFullscreen</span></span> 属性:</strong></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="dialogFullScreen"</span><span style="color: rgba(255, 0, 0, 1)"> parent</span><span style="color: rgba(0, 0, 255, 1)">="Theme.AppCompat.Dialog"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorPrimary"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorPrimary<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorPrimaryDark"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorPrimaryDark<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="colorAccent"</span><span style="color: rgba(0, 0, 255, 1)">></span>@color/colorAccent<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:windowBackground"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/white<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:textColor"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/black<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:windowFullscreen"</span><span style="color: rgba(0, 0, 255, 1)">></span>true<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong><span style="color: rgba(0, 0, 0, 1)">以上2种互为互补,都可以实现需要的效果<br></span></strong></p>
<p>然后依然是重写DialogFragment</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog3 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {</span><span style="color: rgba(0, 0, 0, 1)">
@Nullable
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view </span>= inflater.inflate(R.layout.set_wifi_password_dialog_layout, container, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> view;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onViewCreated(@NonNull <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> View view, @Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">设置宽度为铺满</span></span>
params.gravity </span>=<span style="color: rgba(0, 0, 0, 1)"> Gravity.BOTTOM;
getDialog().getWindow().setAttributes((WindowManager.LayoutParams) params);
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}
}</span></pre>
</div>
<p><strong>然后是重点</strong>,在创建<strong>DialogFragment对话框的时候添加我们的style。</strong></p>
<div class="cnblogs_code">
<pre> mBtnTest.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
MyDialog3 myDialog </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyDialog3();
myDialog.setStyle(DialogFragment.STYLE_NORMAL, R.style.dialogFullScreen);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加上面创建的style</span>
myDialog.show(getSupportFragmentManager(),"aa"<span style="color: rgba(0, 0, 0, 1)">);
}
});</span></pre>
</div>
<p>下方的效果图里,我们就获得了一个在宽度上铺满屏幕的对话框,举一反三在设置高度上也是一样的:</p>
<p><img src="https://img2018.cnblogs.com/common/1497956/201912/1497956-20191216152434172-143904401.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">设置点击外部空白处不会关闭对话框 </span></h1>
<h3><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)">方式一<br></span></h3>
<p><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)"> 在前面创建的对话框里,在点击外部后依然会关闭对话框,我们有时候有些重要消息并不希望用户可以点击外部可以取消。</span></p>
<p><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)">这个属性一样在styles.xml,创建style里添加 <span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">item <span style="color: rgba(255, 0, 0, 1)">name<span style="color: rgba(0, 0, 255, 1)">="android:windowCloseOnTouchOutside"<span style="color: rgba(0, 0, 255, 1)">>false<span style="color: rgba(0, 0, 255, 1)"></<span style="color: rgba(128, 0, 0, 1)">item<span style="color: rgba(0, 0, 255, 1)">> </span></span></span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="dialogFullScreen"</span><span style="color: rgba(255, 0, 0, 1)"> parent</span><span style="color: rgba(0, 0, 255, 1)">="Theme.AppCompat.Dialog"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:padding"</span><span style="color: rgba(0, 0, 255, 1)">></span>0dp<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:windowBackground"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/white<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:textColor"</span><span style="color: rgba(0, 0, 255, 1)">></span>@android:color/black<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="android:windowCloseOnTouchOutside"</span><span style="color: rgba(0, 0, 255, 1)">></span>false<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<h3><span style="color: rgba(0, 0, 0, 1)"><strong>方式二</strong></span></h3>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">getDialog().setCancelable(false);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这个会屏蔽掉返回键</span>
getDialog().setCanceledOnTouchOutside(isCanceledOnTouchOutside());</pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">设置在弹出对话框后同时弹出软键盘 </span></h1>
<p> 我只需要两步,1.将需要输入内容的EditText设置为焦点 2.设置软键盘可见</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog3 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {</span><span style="color: rgba(0, 0, 0, 1)">
@Nullable
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view </span>= inflater.inflate(R.layout.set_wifi_password_dialog_layout, container, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> view;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onViewCreated(@NonNull <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> View view, @Nullable Bundle savedInstanceState) {
EditText editPassword </span>=<span style="color: rgba(0, 0, 0, 1)"> view.findViewById(R.id.edit_password);
editPassword.requestFocus();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置焦点</span>
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置输入盘可见</span>
<span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
params.gravity </span>=<span style="color: rgba(0, 0, 0, 1)"> Gravity.BOTTOM;
getDialog().getWindow().setAttributes((WindowManager.LayoutParams) params);
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}
}</span></pre>
</div>
<p>效果图:</p>
<p><img src="https://img2018.cnblogs.com/common/1497956/201912/1497956-20191216163251271-1376451759.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">在Fragment里启动对话框</span></h1>
<p>与activity里一样没啥区别,唯一的区别就是你打算依然用老套的onActivityResult来向下传值,那么你就需要设置一个目标Fragment在下面的代码里<span style="color: rgba(0, 0, 0, 1)">setTargetFragment()方法就是起到这个作用的</span>,在下面的代码里我们用MyDialog1 启动了 MyDialog2。</p>
<p><span style="color: rgba(0, 0, 0, 1)">DialogFragment其实就是<span style="color: rgba(0, 0, 0, 1)">Fragment</span>,所以我这里就偷懒一下,直接用对话框启动对话框了。。。不在单独写一个<span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">Fragment</span></span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">MyDialog1.Java</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog1 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {
@NonNull
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {</span>
AlertDialog.Builder dialog = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AlertDialog.Builder(getContext());
dialog.setTitle(</span>"测试Dialog"<span style="color: rgba(0, 0, 0, 1)">);
dialog.setMessage(</span>"启动另外一个对话框"<span style="color: rgba(0, 0, 0, 1)">);
dialog.setPositiveButton(</span>"启动", <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DialogInterface.OnClickListener() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onClick(DialogInterface dialog, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> which) {
MyDialog2 myDialog2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyDialog2();
myDialog2.setTargetFragment(MyDialog1.</span><span style="color: rgba(0, 0, 255, 1)">this</span>, 300<span style="color: rgba(0, 0, 0, 1)">);
myDialog2.setStyle(DialogFragment.STYLE_NORMAL, R.style.dialogFullScreen);</span>
myDialog2.show(getFragmentManager(), "myDialog2"<span style="color: rgba(0, 0, 0, 1)">);
}
});
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> dialog.create();
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);</span>
<span style="color: rgba(0, 0, 0, 1)"> }
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onActivityResult(<span style="color: rgba(0, 0, 255, 1)">int</span> requestCode, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> resultCode, @Nullable Intent data) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onActivityResult(requestCode, resultCode, data);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里可以返回 MyDialog2Fragment的数据</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">MyDialog2.Java</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyDialog2 <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> DialogFragment {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> String TAG = "MyDialog"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener;
@Nullable
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view </span>= inflater.inflate(R.layout.set_wifi_password_dialog_layout, container, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> view;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onViewCreated(@NonNull <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> View view, @Nullable Bundle savedInstanceState) {</span>
<span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onViewCreated(view, savedInstanceState);
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
params.gravity </span>=<span style="color: rgba(0, 0, 0, 1)"> Gravity.BOTTOM;
getDialog().getWindow().setAttributes((WindowManager.LayoutParams) params);
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}
}</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">设置圆角与实际不符合的问题</span></h1>
<p>实际上是你设置的背景图片,被Dialog自带的背景遮盖了,导致圆角无法显示。所以设置一下透明背景就可以了。</p>
<p>注意设置DecorView的背景与设置<span style="color: rgba(0, 0, 0, 1)">Window</span>的背景是有区别的,区别如下:</p>
<h3>设置DecorView背景</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> @Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
getDialog().getWindow().setAttributes(params);
getDialog().getWindow().getDecorView().setBackground(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ColorDrawable(Color.TRANSPARENT));<br></span><span style="color: rgba(0, 0, 255, 1)"> super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}</span></pre>
</div>
<p>效果图:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202003/1497956-20200314162634034-2011651722.png" alt=""></p>
<h3>设置<span style="color: rgba(0, 0, 0, 1)">Window的背景</span></h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> @Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onStart() {
WindowManager.LayoutParams params </span>=<span style="color: rgba(0, 0, 0, 1)"> getDialog().getWindow().getAttributes();
params.width </span>=<span style="color: rgba(0, 0, 0, 1)"> ViewGroup.LayoutParams.MATCH_PARENT;
getDialog().getWindow().setAttributes(params);</span><span style="color: rgba(0, 0, 0, 1)">
getDialog().getWindow().setBackgroundDrawable(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ColorDrawable(Color.TRANSPARENT));
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onStart();
}</span></pre>
</div>
<p> <img src="https://img2020.cnblogs.com/blog/1497956/202003/1497956-20200314162707735-602500329.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">改变Window背景的透明度</span></h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> @Override
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
</span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onCreate(savedInstanceState);
WindowManager.LayoutParams layoutParams </span>=<span style="color: rgba(0, 0, 0, 1)"> getWindow().getAttributes();
layoutParams.dimAmount </span>= 0f;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调整透明度</span>
<span style="color: rgba(0, 0, 0, 1)"> getWindow().setAttributes(layoutParams);
</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<h1><span style="color: rgba(22, 145, 121, 1)">个人封装的BaseDialogFragment类</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">将对话框显示比例、对话框状态栏显示、状态栏边框封装处理、当然你也可以通过上面的styles.xml的方式进行封装处理。个人比较喜欢用代码配置,这样方便复制到其他项目中使用。</span></p>
<pre class="highlighter-hljs" data-dark-theme="true"><code>
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.View
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
/**
* DialogFragment基础对话框
*/
abstract class BaseDialogFragment : DialogFragment() {
private var mWidthRatio = 1f
private var mHeightRatio = 1f
private var mIsShowNavigation = false
/**
* 设置对话框宽度与屏幕宽度占比 0.0~1.0
*
* @param widthRatio
*/
open fun setWidthHeightRatio(widthRatio: Float, heightRation: Float) {
mWidthRatio = widthRatio
mHeightRatio = heightRation
}
/**
* 设置是否显示对话框
*/
open fun setShowNavigation(isShowNavigation: Boolean) {
mIsShowNavigation = isShowNavigation
}
override fun onStart() {
super.onStart()
dialog?.window?.let { window ->
//隐藏导航栏
if (!mIsShowNavigation) {
// 隐藏导航栏并禁止显示
val decorView: View = window.decorView
val uiOptions = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
decorView.systemUiVisibility = uiOptions
}
//去除对话框内边距与背景透明
context?.let { context ->
val layoutParams: WindowManager.LayoutParams = window.getAttributes()
if (mWidthRatio == 1f) {
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT
} else {
val width = context.resources.displayMetrics.widthPixels * mWidthRatio
layoutParams.width = width.toInt()
}
if (mHeightRatio == 1f) {
layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT
} else {
val height = context.resources.displayMetrics.heightPixels * mHeightRatio
layoutParams.height = height.toInt()
}
window.attributes = layoutParams
}
//透明背景
window.decorView.background = ColorDrawable(Color.TRANSPARENT)
//去除边距
window.decorView.setPadding(0, 0, 0, 0)
}
}
}</code></pre>
<p>使用它的例子代码:</p>
<pre class="highlighter-hljs" data-dark-theme="true"><code>class SelectDialog(val childId: Int) : BaseDialogFragment() {
private lateinit var mBinding: MainDialogSelectBinding
private val mViewModel by lazy { activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) } }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
mBinding = MainDialogSelectBinding.inflate(inflater)
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setWidthHeightRatio(0.6f, 0.76f)
mBinding.content.text = "是否删除孩子数据?"
mBinding.cancel.setOnClickListener {
dismiss()
}
mBinding.submit.setOnIntervalClickListener {
mViewModel?.deleteChild(childId)
}
}
}</code></pre>
<p> activity中显示</p>
<pre class="highlighter-hljs" data-dark-theme="true"><code>SelectDialog(it.id).show(supportFragmentManager, "ChildDeleteConfirmDialog")</code></pre>
<p> </p>
<p>end</p>
</div>
<div id="MySignature" role="contentinfo">
<div style="text-align: center">
<p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/12044196.html </p>
<div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/12044196.html
頁:
[1]