本文僅供學習參考,如有雷同,純屬巧合
之前寫的一個項目需要實現類似微信以前版本的註銷提示框的效果,所以就到網上找了一下,發現大家的方法各有所長,
我自己整理了一個方法,在這裏做個筆記,如果這篇文章被你搜到了,那就參考一下吧,共同學習,大家評論見。
受這篇文章的啓發→ 彈出窗口的兩種實現方式 PopupWindow 和 Activity
下面開始正題
先說下思路:要自定義dialog的樣式,我想到的方法就是不用dialog的setTitle(),setMessage等方法,因爲那樣dialog的樣式就又成了Android自帶樣式了,把dialog給window,然後用window加載佈局,這個佈局就是對話框的佈局了,這個佈局什麼樣,對話框彈出來就是什麼樣。
還有就是,如果只用AlertDialog的話,加載出來的佈局寬度是不會充滿屏幕寬的,兩邊會有空隙,這是因爲Dialog會有一個默認的樣式,用window的話可以設置dialog的寬高,(個人認爲底部彈出的對話框兩邊有空隙不好看,所以用這個方法解決了,如果你不要求這個,可以只實例化一個AlertDialog就可以了)
接下來是代碼,僅僅一個方法就夠了:
private void showDialog() {
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.create();
dialog.show();
Window window = dialog.getWindow();
// 設置佈局
window.setContentView(R.layout.alertdialog);
// 設置寬高
window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
// 設置彈出的動畫效果
window.setWindowAnimations(R.style.AnimBottom);
// 設置監聽
Button ok = (Button) window.findViewById(R.id.btn_ok);
Button cancel = (Button) window.findViewById(R.id.btn_cancel);
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
// 因爲我們用的是windows的方法,所以不管ok活cancel都要加上“dialog.cancel()”這句話,
// 不然有程序崩潰的可能,僅僅是一種可能,但我們還是要排除這一點,對吧?
// 用AlertDialog的兩個Button,即使監聽裏什麼也不寫,點擊後也是會吧dialog關掉的,不信的同學可以去試下
}
貼上兩個動畫效果的文件和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="50%p"
android:toYDelta="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" />
</set>
Style樣式(寫在values文件夾下style.xml文件裏):
<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>
總結:上面的那篇帖子用Activity當彈出窗口的方法,不得不說方法非常新穎,但是有個缺點,就是每用一個對話框都要寫一個類,而且還要寫一個佈局,這樣很費事。而且如果要是對話框中有EditText時,Activity之間獲取變量不太方便……
我這種方法如果用到彈出框的需求多並且樣式類似的話,可以加載同一個佈局,然後對佈局裏的TextView和Button設置內容就可以了,較爲靈活。