Ⅰ 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));