效果图:
Dialog的使用对Android开发者来说再经常不过了,这里分享一种使用Dialog实现PopupWindow效果的方法。
一、我们最好写一个工具类,用的时候直接调:
public class DialogUtils {
public static void showDialog(Context context, final OnTextClickListener onTextClickListener) {
Dialog dialog = new Dialog(context, R.style.DialogCommonStyle);
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);// 位置
window.setContentView(R.layout.layout_my_dialog);
// 这里findViewBuId初始化控件,设置数据等等。
// 。。。
// 。。。
TextView textView = window.findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onTextClickListener.onTextClick("传递数据");
}
});
dialog.setCanceledOnTouchOutside(true);// 触摸外面关闭dialog
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = ScreenUtils.getScreenWidth(context);// dialog宽等于屏幕宽
lp.height = ScreenUtils.getScreenHeight(context) * 1/2;// dialog高为屏幕高一半
window.setAttributes(lp);
window.setBackgroundDrawableResource(R.color.black);// dialog背景
window.setWindowAnimations(R.style.AnimBottom);
dialog.show();
}
public interface OnTextClickListener {
void onTextClick(String str);
}
}
我们在layout_my_dialog.xml中自己布局,我这里只放了一个TextView作为例子,当然你可以放复杂的布局,例如:RecyclerView、自定义控件等等。通过定义接口来回调数据,这样做就完美的和activity分离了,而且复用性很强。
style.xml
<style name="DialogCommonStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
<!-- 从底部往上推出的动画 -->
<style name="AnimBottom" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
<item name="android:windowExitAnimation">@anim/push_bottom_out</item>
</style>
push_bottom_in.xml
<?xml version="1.0" encoding="utf-8"?><!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromYDelta="100%p"
android:toYDelta="0" />
<alpha
android:duration="200"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
push_bottom_out.xml
<?xml version="1.0" encoding="utf-8"?><!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromYDelta="0"
android:toYDelta="50%p" />
<alpha
android:duration="200"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>