Ⅰ android Dialog 设置Margin方式总结
在日常开发中,总是会遇到各种Dialog的使用,调整根据UI设计的不同,会经常调整Dialog在屏幕中的位置,这篇文章主要介绍,在使用 DialogFragment 时设置Margin的几种方式。
如下是最后实现的效果:
设置两边margin效果:
设置顶部margin效果:
全屏的Dialog设置顶部Margin:
这个比较容易,主要就是设置一个高度wrap_content,宽度match_parent的dialog,然后在dialog的布局中设置margin就可以了。
如下是xml文件:
然后在DialogFragment的onResume里对Window做一些处理:
这种情况margin可以通过 WindowManager.LayoutParams 的 verticalMargin 属性来实现。 verticalMargin 和xml里面设置的layout_margin不一样, verticalMargin 是通过设置一个0-1的float变量,来标识margin在屏幕中的占比。
如下是在DialogFragment的onResume中的处理:
xml文件(和1的类似,没有什么特别):
这里如果使用2中的方法,没有任何效果。这里使用另外一种方式实现-- insetDrawable 。
这里的实现是在xml里面写一个 <inset> :
在DialogFragment的onResume方法中:
Ⅱ 在android开发中,如何控制dialog 的大小 和 图片的大小
1、控制大小和位置
/*
*
获取对话框的窗口对象及参数对象以修改对话框的布局设置,
*
可以直接调用getWindow(),表示获得这个Activity的Window
*
对象,这样这可以以同样的方式改变这个Activity的属性.
*/
Window
dialogWindow
=
dialog.getWindow();
WindowManager.LayoutParams
lp
=
dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.LEFT
|
Gravity.TOP);
/*
*
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.
*
*
本来setGravity的参数值为Gravity.LEFT
|
Gravity.TOP时对话框应出现在程序的左上角,但在
*
我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
*
Gravity.LEFT,
Gravity.TOP,
Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
*/
lp.x
=
100;
//
新位置X坐标
lp.y
=
100;
//
新位置Y坐标
lp.width
=
300;
//
宽度
lp.height
=
300;
//
高度
lp.alpha
=
0.7f;
//
透明度
//
当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes
//
dialog.onWindowAttributesChanged(lp);
dialogWindow.setAttributes(lp);
/*
*
将对话框的大小按屏幕大小的百分比设置
*/
//
WindowManager
m
=
getWindowManager();
//
Display
d
=
m.getDefaultDisplay();
//
获取屏幕宽、高用
//
WindowManager.LayoutParams
p
=
getWindow().getAttributes();
//
获取对话框当前的参数值
//
p.height
=
(int)
(d.getHeight()
*
0.6);
//
高度设置为屏幕的0.6
//
p.width
=
(int)
(d.getWidth()
*
0.65);
//
宽度设置为屏幕的0.95
//
dialogWindow.setAttributes(p);
Ⅲ android 如何让自定义dialog的宽度充满整个屏幕
方案:
通过设置Dialog的样式实现
步骤:
java">1、添加style
<stylename="Dialog_FS">
<itemname="android:windowFullscreen">true</item>
<itemname="android:windowNoTitle">true</item>
</style>
2、代码里面设置dialog的样式
Dialogdialog=newDialog(this,R.style.Dialog_FS);//设置全屏样式
dialog.setContentView(R.layout.main);//设置dialog的布局
dialog.show();//显示dialog界面
Ⅳ android自定义对话框宽不能占满父layout的解决办法有哪些
1.FrameLayout
FrameLayout 是 最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 —
比如,一张你要发布的图片。所有的子元素将会固定
在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡
住(除非后一个子元素是透明的)。
FrameLayout is the simplest type of layout object. It's basically a blank
space on your screen that you can later fill with a single object — for example,
a picture that you'll swap in and out. All child elements of the FrameLayout are
pinned to the top left corner of the screen; you cannot specify a different
location for a child view. Subsequent child views will simply be drawn over
previous ones, partially or totally obscuring them (unless the newer object is
transparent).
FrameLayout默认填充widget等在左上角,然后后面的控件遮住前面的,比如说有两个TextView,Text内容分别是I am
textview 1 和
I am textview 2 看到的效果会如下:?xml version="1.0" encoding="utf-8"?>
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 1"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 2"
/>
2.LinearLayout
LinearLayout
以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多
宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素
的右对齐、中间对齐或者左对齐)。
LinearLayout
还支持为单独的子元素指定weight。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight值,剩余的空间就会按这些子元素指定的weight比例分配给这些子元素。默认的weight值为0。例如,如
果有三个文本框,其中两个指定了weight值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大。
下 面的两个窗体采用LinearLayout,包含一组的元素:一个按钮,几个标签,几个文本框。两个窗体都为布局做了一番修饰。文本框的width被设置
为FILL_PARENT;其它元素的width被设置为WRAP_CONTENT。默认的对齐方式为左对齐。左边的窗体没有设置weight(默认为
0);右边的窗体的comments文本框weight被设置为1。如果Name文本框也被设置为1,那么Name和Comments这两个文本框将会有同样的高度。
在 一个水平排列的LinearLayout中,各项按他们的文本基线进行排列(第一列第一行的元素,即最上或最左,被设定为参考基线)。因此,人们在一个窗
体中检索元素时,就不需要七上八下地读元素的文本了。我们可以在layout的XML中设置
android:baselineAligned="false",来关闭这个设置。
LinearLayout aligns all children in a single direction — vertically or
horizontally, depending on how you define the orientation attribute. All
children are stacked one after the other, so a vertical list will only have one
child per row, no matter how wide they are, and a horizontal list will only be
one row high (the height of the tallest child, plus padding). A LinearLayout
respects margins between children and the gravity(right, center, or left
alignment) of each child.
LinearLayout是Android
sdk创建project时的默认Layout,支持两种方式,默认是垂直vertical的线性layout,另一个是水平horizontal方向的线性排列。
效果如下android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 1"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 2"
/>android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="10px"
android:layout_height="fill_parent"
android:text="I am textview 1"
/>
android:layout_width="10px"
android:layout_height="wrap_content"
android:text="I am textview 2"
/>
3.RelativeLayout
RelativeLayout 允
许子元素指定他们相对于其它元素或父元素的位置(通过ID指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,
因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用XML来指定这个layout,在你定义它之前,
被关联的元素必须定义。
这是一个RelativeLayout例子,其中有可视的和不可视的元素。基础的屏幕layout对象是一个RelativeLayout对象。
这 个视图显示了屏幕元素的类名称,下面是每个元素的属性列表。这些属性一部份是由元素直接提供,另一部份是由容器的LayoutParams成员
(RelativeLayout的子类)提供。RelativeLayout参数有
width,height,below,alignTop,toLeft,padding和marginLeft。注意,这些参数中的一部份,其值是相对
于其它子元素而言的,所以才RelativeLayout。这些参数包括toLeft,alignTop和below,用来指定相对于其它元素的左,上和
下的位置。
RelativeLayout lets child views specify their position relative to the
parent view or to each other (specified by ID). So you can align two elements by
right border, or make one below another, centered in the screen, centered left,
and so on. Elements are rendered in the order given, so if the first element is
centered in the screen, other elements aligning themselves to that element will
be aligned relative to screen center. Also, because of this ordering, if using
XML to specify this layout, the element that you will reference (in order to
position other view objects) must be listed in the XML file before you refer to
it from the other views via its reference ID.android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding = "10px"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 1"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="I am textview 2"
android:layout_marginLeft = "150px"
/>
android:id="@+id/Button02" android:layout_width="wrap_content"
android:text="Ok"
android:layout_height="wrap_content"
android:layout_marginLeft = "240px"
android:layout_marginTop = "40px"
>
android:layout_marginLeft = "160px"
android:layout_marginTop = "40px"
>
4.AbsoluteLayout
AbsoluteLayout 可 以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0,
0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout没有页边
框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用AbsoluteLayout,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至
于在不同的设备上可能不能很好地工作。
5.TableLayout
TableLayout 将子元素的位置分配到行或列中。android的
一个TableLayout由许多的TableRow组成,每个TableRow都会定义一个row(事实上,你可以定义其它的子对象,这在下面会解释
到)。TableLayout容器不会显示row、cloumns或cell的边框线。每个row拥有0个或多个的cell;每个cell拥有一个
View对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML中的不一样。下图显示了一个TableLayout,图
中的虚线代表不可视的单元格边框。
列可以被隐藏,也可以被设置为伸展的从而填充可利用的屏幕空间,也可以被设置为强制列收缩直到表格匹配屏幕大小。对于更详细信息,可以查看这个类的参考文档。
TableLayout positions its children into rows and columns. TableLayout
containers do not display border lines for their rows, columns, or cells. The
table will have as many columns as the row with the most cells. A table can
leave cells empty, but cells cannot span columns, as they can in HTML.
TableRow objects are the child views of a TableLayout (each TableRow
defines a single row in the table). Each row has zero or more cells, each of
which is defined by any kind of other View. So, the cells of a row may be
composed of a variety of View objects, like ImageView or TextView objects. A
cell may also be a ViewGroup object (for example, you can nest another
TableLayout as a cell).
TableLayout和HTML的基本上类似,还提供TableRow class, 直接等价与比如说要做成一个类似下面的HTML叶面
I am textview1I am textview2
[OK button]
[Cancel button]android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:text="I am textview 1" />
android:paddingLeft = "20px"
android:width = "200px"
android:text="I am textview 2"
/>
android:id="@+id/Button02" android:text="Ok"
>
>
Ⅳ android 使用activity 当dialog弹出框 ,layout出现左右两边有间距
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(lp);
Ⅵ android 中如何点击一个图标实现另一个界面不是充满全屏的
可以设置界面布局的宽度和高度,使之小于屏幕的宽高。当点击图标时开启一个新的activity,此时布局不会覆盖全屏。
可以设置图标的点击事件为弹出一个对话框 Dialog,如果需要模态窗口可以弹出AlertDialog,设置好dialog的宽高就可以实现不覆盖全屏。
在Mainfaest.xml 文件中activity元素里设置theme属性android:theme="@android:style/Theme.Dialog 可以让activity以对话框的形式展现。
非模态的窗口还可以用popup menu实现。可以在当前视图上层展现布局,控制好宽高同样能达到效果
Ⅶ 如何设置Dialog铺满全屏,更改Dialog的显示位置
AndroidDialog示例代码:
1.创建象框
AlertDialog.Builder builder = new Builder(context);
builder.setTitle("请输入"); //设置框标题
builder.setIcon(android.R.drawable.btn_star); //设置框标题前图标
2.创建EditText输入框
final EditText edit = new EditText(context);
3.输入框赋值给Dialog,并增加确定取消按键
builder.setView(edit);
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "输入: " + edit.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "点取消", Toast.LENGTH_SHORT).show();
}
});
4.设置用api并show弹
builder.setCancelable(true); //设置按钮否按返键取消,false则取消
AlertDialog dialog = builder.create(); //创建框
dialog.setCanceledOnTouchOutside(true); //设置弹框失焦点否隐藏,即点击屏蔽其否隐藏
dialog.show();
Ⅷ 怎么设置dialog的宽和高度
1. 如果您是直接从资源值转换: int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
int height = getResources().getDimensionPixelSize(R.dimen.popup_height);
getDialog().getWindow().setLayout(width, height);
然后在你的布局中指定match_parent的对话框: android:layout_width="match_parent"
android:layout_height="match_parent"
你只需要担心一个地方。它并不完美,但至少它适用于有一个RelativeLayout作为你的对话框的布局文件的根目录。
2. 我有一个固定大小的定义在XML主要布局(LinearLayout中在我的情况)以下内容:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"
3. 你可以在下面的代码从Java布局设置宽度和高度。 final AlertDialog alertDialog = alertDialogBuilder.create();
final WindowManager.LayoutParams WMLP = alertDialog.getWindow().getAttributes();
WMLP.gravity = Gravity.TOP;
WMLP.y = mActionBarHeight;
WMLP.x = getResources().getDimensionPixelSize(R.dimen.unknown_image_width);
alertDialog.getWindow().setAttributes(WMLP);
alertDialog.show();
4. 在我的情况下工作的唯一的事情是该解决方案在这里指出:
从阿迪尔博客文章片段: @Override
public void onStart()
{
super.onStart();
// safety check
if (getDialog() == null)
return;
int dialogWidth = ... // specify a value here
int dialogHeight = ... // specify a value here
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
// ... other stuff you want to do in your onStart() method
}
5. 我固定它设置根布局 int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));