編輯:關於Android編程
在Android中經常要使用Dialog來實現一些提示以及一些特殊的效果,而且樣式也不一樣,每次都得查一大堆資料,還不一定能解決,這裡總結一些常用的Dialog的實踐。
//普通的AlertDialog對話框
findViewById(R.id.btn_common).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("普通的對話框的標題");
builder.setMessage("這是一個普通的對話框的內容");
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
toast("取消");
}
});
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
toast("確定");
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
這裡使用AlertDialog來顯示一個系統的提示對話框,效果如下:
主要是在普通的dialog.show() 下面加上如下代碼
//放在show()之後,不然有些屬性是沒有效果的,比如height和width
Window dialogWindow = dialog.getWindow();
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 獲取屏幕寬、高用
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 獲取對話框當前的參數值
//設置高度和寬度
p.height = (int) (d.getHeight() * 0.4); // 高度設置為屏幕的0.6
p.width = (int) (d.getWidth() * 0.6); // 寬度設置為屏幕的0.65
//設置位置
p.gravity = Gravity.BOTTOM;
//設置透明度
p.alpha = 0.5f;
dialogWindow.setAttributes(p);
在這裡,設置dialog的高為屏幕的高度的4/10,寬為屏幕寬帶的6/10,同事位置為底部,透明度為半透明。當然還有很多其他屬性,這裡暫不介紹,你們可以自己試一試。效果如下:
我們需自定義一個布局,如下:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp" android:background="#00ff00"> <textview android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textcolor="#ff0000" android:text="你好"> </textview></linearlayout></code>
我們這裡新建了一個布局設置高度和寬度為100dp,線性布局裡面包裹了一個TextView,布局很簡單,當然也可以自定義一個復雜的布局,這裡就不介紹了。來看看java代碼的實現。
// 使用普通的dialog來添加自定義布局
findViewById(R.id.btn_custom2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setView(R.layout.dialog_custom1);
AlertDialog dialog = builder.create();
dialog.show();
}
});
我們直接把我們的布局通過builder設置進去,看看效果:
這裡的Dialog非常丑,這是與AlertDialog的默認主題有關,下面我們通過自定義主題來改變對話框的樣式來使對話框變得漂亮。
在values喎?/kf/ware/vc/" target="_blank" class="keylink">vc3R5bGVzLnhtbNfUtqjS5dH5yr28zLPQYW5kcm9pZDpUaGVtZS5EaWFsb2fAtMq1z9bX1Ly6tcTR+cq9PC9wPg0KPHByZSBjbGFzcz0="brush:java;">
這裡樣式的屬性都有注釋,沒種樣式不是必須的,你可以自己試著改變一些值來查看效果以便達到自己的最佳效果。
在創建dialog的時候將樣式傳過去
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,R.style.MyCommonDialog);
現在的效果如下:
可以看的我們的布局的高度和寬帶還是沒效果,我們知道子空間的布局一般由布局來測量的於是我想到給這個布局的最外層套一個布局,看能不能達到我們的效果。
修改dialog_custom1.xml布局如下:
<code class=" hljs xml"><!--?xml version="1.0" encoding="utf-8"--> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:layout_width="100dp" android:layout_height="100dp" android:layout_centerinparent="true" android:background="#00ff00"> <textview android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="你好" android:textcolor="#ff0000"> </textview></linearlayout> </relativelayout><!--?xml--></code>
達到我們想要的效果了,這樣你就可以引入樣式和自定義布局實現各種對話框的效果了。
通過繼承Dialog來實現自定義的Dialog,這樣我們就可以在任何地方直接new我們的Dialog就可以實現特定的對話框了。
1.在values/styles.xml新建一個樣式MyDialog
2.新建一個MyDialog繼承Dialog
public class MyDialog extends Dialog {
//在構造方法裡預加載我們的樣式,這樣就不用每次創建都指定樣式了
public MyDialog(Context context) {
this(context, R.style.MyDialog);
}
public MyDialog(Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 預先設置Dialog的一些屬性
Window dialogWindow = getWindow();
WindowManager.LayoutParams p = dialogWindow.getAttributes();
p.x = 0;
p.y = 100;
p.gravity = Gravity.LEFT | Gravity.TOP;
dialogWindow.setAttributes(p);
}
}
/*來自:互聯網,忘記出處,請看到與我聯系
* lp.x與lp.y表示相對於原始位置的偏移.
* 當參數值包含Gravity.LEFT時,對話框出現在左邊,所以lp.x就表示相對左邊的偏移,負值忽略.
* 當參數值包含Gravity.RIGHT時,對話框出現在右邊,所以lp.x就表示相對右邊的偏移,負值忽略.
* 當參數值包含Gravity.TOP時,對話框出現在上邊,所以lp.y就表示相對上邊的偏移,負值忽略.
* 當參數值包含Gravity.BOTTOM時,對話框出現在下邊,所以lp.y就表示相對下邊的偏移,負值忽略.
* 當參數值包含Gravity.CENTER_HORIZONTAL時,對話框水平居中,所以lp.x就表示在水平居中的位置移動
* lp.x像素,正值向右移動,負值向左移動.
* 當參數值包含Gravity.CENTER_VERTICAL時,對話框垂直居中,所以lp.y就表示在垂直居中的位置移動lp.y像
* 素,正值向右移動,負值向左移動.
* gravity的默認值為Gravity.CENTER,即Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL
*/
這裡對window的一些參數進行了解釋,我把對話框設置的離左上角離頂部100px的位置。
3.使用MyDialog
自定義布局dialog_custom2.xml
<code class=" hljs xml"><!--?xml version="1.0" encoding="utf-8"--> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerinparent="true" android:background="#ffffff" android:orientation="vertical" android:padding="10dp"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> </textview></textview></textview></linearlayout> </relativelayout><!--?xml--></code>
java代碼
//繼承Dialog來實現Dialog
findViewById(R.id.btn_custom3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialog dialog = new MyDialog(MainActivity.this);
dialog.setContentView(R.layout.dialog_custom2);
dialog.show();
}
});
1.新建動畫文件
進入動畫dialog_enter.xml
<code class=" hljs xml"><!--?xml version="1.0" encoding="utf-8"--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fillafter="true" android:fromydelta="100%p" android:toydelta="0%"> </translate></set><!--?xml--></code>
退出動畫dialog_exit.xml
<code class=" hljs xml"><!--?xml version="1.0" encoding="utf-8"--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fillafter="true" android:fromydelta="0%" android:toydelta="100%p"> </translate></set><!--?xml--></code>
2.在values/styles.xml中新建樣式
<code class=" hljs applescript"><style name="MyAnimDialog" parent="android:Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimAmount">0.5</item> <item name="android:windowAnimationStyle">@style/dialog_animation</item></style> <item name="android:windowEnterAnimation">@anim/dialog_enter</item> <item name="android:windowExitAnimation">@anim/dialog_exit</item></style></code>
主要是給android:windowAnimationStyle指定我們新建的動畫即可,引用和前面一樣,這裡就給出了,
3.查看效果
自定義MyBottomDialog
public class MyBottomDialog extends Dialog {
public MyBottomDialog(Context context) {
this(context, R.style.MyAnimDialog);
}
public MyBottomDialog(Context context, int themeResId) {
super(context, themeResId);
//加載布局並給布局的控件設置點擊事件
View contentView = getLayoutInflater().inflate(R.layout.dialog_custom3, null);
contentView.findViewById(R.id.tv_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "你好", Toast.LENGTH_SHORT).show();
}
});
super.setContentView(contentView);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 預先設置Dialog的一些屬性
Window dialogWindow = getWindow();
WindowManager.LayoutParams p = dialogWindow.getAttributes();
WindowManager m = getWindow().getWindowManager();
Display d = m.getDefaultDisplay();
getWindow().setAttributes(p);
p.height = (int) (d.getHeight() * 0.6);
p.width = d.getWidth();
p.gravity = Gravity.LEFT | Gravity.BOTTOM;
dialogWindow.setAttributes(p);
}
}
在onCreate方法裡指定的Dialog的高度和寬度
布局dialog_custom3.xml
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerinparent="true" android:background="#ffffff" android:orientation="vertical" android:padding="10dp"> <textview android:id="@+id/tv_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="#00ff00" android:gravity="center" android:padding="10dp" android:text="你好" android:textcolor="#000000"> </textview></textview></textview></linearlayout> </relativelayout></code>
使用是方法是一樣的
//繼承Dialog來實現底部彈出Dialog
findViewById(R.id.btn_custom5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyBottomDialog dialog = new MyBottomDialog(MainActivity.this);
dialog.show();
}
});
這裡就不用設置布局了,因為我們在MyBottomDialog的構造方法裡已經預加載了布局並設置了點擊事件
查看效果:
MyMenuDialog的代碼
public class MyMenuDialog extends Dialog {
public MyMenuDialog(Context context) {
this(context, R.style.MyDialog);
}
public MyMenuDialog(Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 預先設置Dialog的一些屬性
Window dialogWindow = getWindow();
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 獲取對話框當前的參數值
//獲取屏幕的高度和寬帶
WindowManager m = getWindow().getWindowManager();
Display d = m.getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
d.getMetrics(outMetrics);
//設置WindowManager.LayoutParams
// p.height = (int) (outMetrics.heightPixels * 0.6);
// p.width = (int) (outMetrics.widthPixels * 0.4);
//根據s隨意來的高度來設置x軸偏移量
p.x = (int) (15 * outMetrics.density);
//根據Title的高度來設置y軸偏移量
p.y = (int) (45 * outMetrics.density);
p.gravity = Gravity.RIGHT | Gravity.TOP;
dialogWindow.setAttributes(p);
}
}
使用就不介紹了,這裡主要是利用WindowManager.LayoutParams的x、y、gravity來實現的,當然可以自定義Dialog的彈出動畫就可以實現一個菜單對話框了。
效果如下:
基本上Dialog的實現了這些效果應該能滿足大部分項目的需求,至於以下復雜的,想帶有ListView、GridView的Dialog等等都可以通過自定義Dialog來繼承Dialog來實現,都是依葫蘆畫瓢就可以了,以後遇到什麼再來補充。
代碼下載地址:https://github.com/cskun/DialogDemo
一、前言關於Android中的分包技術,已經不是什麼新的技術了,網上也有很多解析了,但是他們都是給了理論上的知道和原理解析,並沒有詳細的案例說明,所以這裡我們就來詳細講解
SlidingMenu簡介: SlidingMenu的是一種比較新的設置界面或配置界面效果,在主界面左滑或者右滑出現設置界面,能方便的進行各種操作.目前有大量的應用都在使
這是一個一言不合就手撸一個自定義View的任性時代,因此最近一段時間一直在學習自定義View相關的知識,也看了很多與此相關的博客,有句話叫做不要重復造輪子,別人寫好的直接
上一篇博文我們介紹了利用ViewPager和Fragment實現頂部滑塊左右滑動效果,具體參考(http://blog.csdn.net/a123demi/article