我实现了一个可自定义大小和位置的Dialog:CustDialog,其父类为AlertDialog
使用示例:
TestDialog t = newTestDialog(AndroidTestActivity.this,R.style.dialog); //TestDialog是CustDialog的子类
t.setLayoutResID(R.layout.chat_dialog); //设置资源布局,,在show()方法前调用
t.setPosition(x/2, y); // 设置dialog位置,在show()方法前调用
t.setRegion(150, 200); // 设置dialog大小,在show()方法前调用
t.show(); // 显示dialog
一些说明:
1, Dialog布局文件必须使用LinearLayout,其id必须是layout。
例如:res/layout/chat_dialog.xml
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="50dp"
android:layout_height="wrap_content"android:id="@id/layout"
android:background="@color/red">
<Button android:id="@+id/btn" android:text="Button"
android:layout_width="match_parent" android:layout_height="wrap_content" />
<TextView android:id="@+id/tv" android:text="initial"
android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
原因:layout是CustDialog实现自定义大小所必须的,使用处在CustDialog.onCreate里,如下:
layout = (LinearLayout)findViewById(R.id.layout);
android.view.ViewGroup.LayoutParams layoutParams = layout.getLayoutParams();
layoutParams.width = this.getWidth();
layoutParams.height = this.getHeight();
layout.setLayoutParams(layoutParams); // 设定大小
它定义在文件res/values/ids.xml里,如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="layout" />
</resources>
2, Dialog的style定义在res/values/style.xml里,如下:
<?xmlversion="1.0" encoding="utf-8"?>
<resources>
<stylename="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item> <!--边框 -->
<item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上 -->
<itemname="android:windowIsTranslucent">false</item><!--半透明 -->
<item name="android:windowNoTitle">true</item><!--无标题 -->
<itemname="android:windowBackground">@color/transparent</item><!--背景透明 -->
<itemname="android:backgroundDimEnabled">false</item><!--模糊 -->
</style>
</resources>
其中属性的中文注释或许不准确,另外还有很多其他属性可以设置,
详细可参考 android源码包中的framwworks/base/policy/src/android/internal/policy/imple/PhoneWindow.java里的函数generateLayout的代码实现,这个是无二义性的!