效果圖:
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>