viewpager/pageradapter,dialogfragment、window類方法
---
ViewPager
viewpager 簡(jiǎn)單介紹:
ViewPager就是一個(gè)簡(jiǎn)單的頁面切換組件,我們可以往里面填充多個(gè)View,然后我們可以左 右滑動(dòng),從而切換不同的View,我們也需要一個(gè)Adapter (適配器)將我們的View和ViewPager進(jìn)行綁定,而ViewPager則有一個(gè)特定的Adapter——?PagerAdapter!另外,Google官方是建議我們使用Fragment來填充ViewPager的,這樣 可以更加方便的生成每個(gè)Page,以及管理每個(gè)Page的生命周期?。╞y 菜鳥教程)
adapter種類:PagerAdapter、FragmentPageAdapter、FragmentStatePagerAdapter;
單純將view與ViewPager進(jìn)行綁定可通過使用PagerAdapter實(shí)現(xiàn)。
將fragment與ViewPager進(jìn)行綁定可通過FragmentPageAdapter和FragmentStatePagerAdapter實(shí)現(xiàn)。
FragmentPageAdapter與FragmentStatePagerAdapter的各自使用場(chǎng)景:
FragmentPageAdapter:和PagerAdapter一樣,只會(huì)緩存當(dāng)前的Fragment以及左邊一個(gè),右邊一個(gè),共三個(gè)頁面。
FragmentStatePagerAdapter:當(dāng)Fragment對(duì)用戶不可見的時(shí)候,整個(gè)Fragment會(huì)被銷毀, 只會(huì)保存Fragment的狀態(tài)!而在頁面需要重新顯示的時(shí)候,會(huì)生成新的頁面!
綜上,F(xiàn)ragmentPageAdapter適合固定的頁面較少的場(chǎng)合;而FragmentStatePagerAdapter則適合 于頁面較多或者頁面內(nèi)容非常復(fù)雜(需占用大量?jī)?nèi)存)的情況!
PagerAdapter的使用:
我們先來介紹最普通的PagerAdapter,如果想使用這個(gè)PagerAdapter需要重寫下面的四個(gè)方法: 當(dāng)然,這只是官方建議,實(shí)際上我們只需重寫getCount()和isViewFromObject()就可以了~
getCount():獲得viewpager中有多少個(gè)view
destroyItem():移除一個(gè)給定位置的頁面。適配器有責(zé)任從容器中刪除這個(gè)視圖。 這是為了確保在finishUpdate(viewGroup)返回時(shí)視圖能夠被移除。
而另外兩個(gè)方法則是涉及到一個(gè)key的東東:
instantiateItem(): ①將給定位置的view添加到ViewGroup(容器)中,創(chuàng)建并顯示出來 ②返回一個(gè)代表新增頁面的Object(key),通常都是直接返回view本身就可以了,當(dāng)然你也可以 自定義自己的key,但是key和每個(gè)view要一一對(duì)應(yīng)的關(guān)系
isViewFromObject(): 判斷instantiateItem(ViewGroup, int)函數(shù)所返回來的Key與一個(gè)頁面視圖是否是 代表的同一個(gè)視圖(即它倆是否是對(duì)應(yīng)的,對(duì)應(yīng)的表示同一個(gè)View),通常我們直接寫 return view == object!? ? ? ?(by 菜鳥教程)
用自己的話表達(dá)instantiateItem:
public Object instantiateItem(ViewGroup container, int position):1.將view add到container,position代表該view的位置,返回值是該view的key值。
示例代碼:
public class MyPagerAdapter extends PagerAdapter {
private ArrayList<View> viewLists;
public MyPagerAdapter() { }
public MyPagerAdapter(ArrayList<View> viewLists) { super(); this.viewLists = viewLists; }
@Override
public int getCount() { return viewLists.size(); }
@Override
public boolean isViewFromObject(View view, Object object) { return view == object; }
@Override
public Object instantiateItem(ViewGroup container, int position) { container.addView(viewLists.get(position)); return viewLists.get(position); }
@Override
public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewLists.get(position)); }
}
FragmentPageAdapter的使用:
示例代碼:
public class FilesFragmentPagerextends FragmentPagerAdapter {
private ListmFragments;
private ListmString;
FilesFragmentPager(@NonNull FragmentManager fm,@NonNull List fragments, List titles) {super(fm); this.mFragments = fragments;mString = titles; }
@Override
public Fragment getItem(int position) {return? mFragments.get(position);}
@Override
public CharSequence getPageTitle(int position) {return mString.get(position); }
@Override
public int getCount() {return mFragments ==null ?0 :mFragments.size(); }
}
代碼解釋:
使用FragmentPageAdapter只需要重寫getItem、getCount即可,當(dāng)viewpager與TabLayout結(jié)合使用時(shí)才需要重寫getPageTitle。
FragmentPageAdapter的instantiateItem()方法如下

從圖片可以看出其內(nèi)部通過調(diào)用getItem()獲取fragment,并將fragment顯示出來。
參考:
ViewPager 詳解(五)-----使用Fragment實(shí)現(xiàn)ViewPager滑動(dòng)
DialogFragment
dialog、alertdialog、dialogfragment的聯(lián)系:
dialog并不被建議直接使用;
alertDialg的父類是dialog,
dialogfragment中可以通過方法onCreateDialog使用alertdialog或dialog創(chuàng)建出dialog
目前Android官方推薦使用DialogFragment替換alertDialog,其優(yōu)點(diǎn)如下:
DialogFragment對(duì)話框出現(xiàn)的意義
為什么android系統(tǒng)有AlertDialog,PopupWindow,這些完全可以滿足基本客戶需求,為什么還要跑出一個(gè)DialogFragment對(duì)話框呢?這就要從DialogFragment的優(yōu)點(diǎn)說起了:
它和Fragment基本一致的生命周期,因此便于Activity更好的控制管理DialogFragment。
隨屏幕旋轉(zhuǎn)(橫豎屏幕切換)DialogFragment對(duì)話框隨之自動(dòng)調(diào)整對(duì)話框大小。而AlertDialog和PopupWindow隨屏幕切換而消失,并且如果處理不當(dāng)很可能引發(fā)異常。
DialogFragment的出現(xiàn)完美的解決了橫豎屏幕切換Dialog消失的問題。
布局方法(二選一):1.onCreateView、onCreateDialog
一點(diǎn)小技巧:
彈窗不要標(biāo)題:
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
彈窗外背景顏色:
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
設(shè)置彈窗布局范圍:
private void initWindowParams() {
if (getDialog()!=null ){
Window window = getDialog().getWindow();
? ? ? ? if (window !=null) {
WindowManager.LayoutParams lp = window.getAttributes();
? ? ? ? ? ? lp.width = WindowManager.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? lp.height = WindowManager.LayoutParams.MATCH_PARENT;
? ? ? ? ? ? window.setAttributes(lp);
? ? ? ? }
}
}
參考:
Dialog,AlertDialog和DialogFragment
Android 官方推薦 : DialogFragment 創(chuàng)建對(duì)話框
Window 布局方法 :requestWindowFeature()?
前言:因?yàn)槭褂胐ialogfragment的時(shí)候用到了getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);消去標(biāo)題欄,好奇為什么通過這樣就能實(shí)現(xiàn)了。
Android 中的Activity、Window、View之間的關(guān)系:
Activity 可以說是應(yīng)用程序的載體(也可以理解為界面的載體,但是不界面),用戶能夠在上面繪制界面(Activity本身不繪制界面),并提供用戶處理事件的API,維護(hù)應(yīng)用程序的生命周期(Android應(yīng)用程序是由多個(gè) Activity 堆積而成,而各個(gè) Activity 又有其獨(dú)立的生命周期)。
? ?Activity內(nèi)部組合了一個(gè)Window(這是一個(gè)抽象類,具體是PhoneWindow)對(duì)象。我們自己寫的擴(kuò)展一個(gè)Activity時(shí),在onCreate 方法中調(diào)用 setContentView,實(shí)際上是調(diào)用Window對(duì)象的 setContentView,所以說界面繪制全部是由Window類的實(shí)現(xiàn)類(PhoneWindow類)來完成的。
筆記 1: onCreate()中的setContentView實(shí)際上是調(diào)用Window對(duì)象的 setContentView;
Window類 基本屬性:
android?Window類的基本屬性如下:
????????? FEATURE_OPTIONS_PANEL = 0;????????????????????? 可選的Panel標(biāo)志(默認(rèn)使能)?
????????? FEATURE_NO_TITLE = 1;???????????????????????????????? 無標(biāo)題欄?
????????? FEATURE_PROGRESS = 2;???????????????????????????????? 標(biāo)題欄上顯示加載進(jìn)度,如webview加載網(wǎng)頁時(shí)(條狀進(jìn)度條)
????????? FEATURE_LEFT_ICON = 3;??????????????????????????????? 標(biāo)題欄左側(cè)顯示一個(gè)圖標(biāo)?
????????? FEATURE_RIGHT_ICON = 4;????????????????????????????? 標(biāo)題欄右側(cè)顯示一個(gè)圖標(biāo)?
????????? FEATURE_INDETERMINATE_PROGRESS = 5;?? 不確定的進(jìn)度(圓圈狀等待圖標(biāo))?
????????? FEATURE_CONTEXT_MENU = 6;??????????????????????? Menu菜單(默認(rèn)使能)?
????????? FEATURE_CUSTOM_TITLE = 7;????????????????????????? 自定義標(biāo)題欄,該屬性不能與其他標(biāo)題欄屬性合用
????????? FEATURE_ACTION_BAR = 8;?????????????????????????????? ActionBar屬性,ActionBar顯示的,TitleBar就沒有啦??????????????????????????????????????????????????????????? ?
????????? FEATURE_ACTION_BAR_OVERLAY = 9;??????????? 覆蓋在內(nèi)容之上的ActionBar
????????? FEATURE_ACTION_MODE_OVERLAY = 10;??????? AcitionBar的覆蓋在內(nèi)容的模式
????????? FEATURE_OPENGL = 8;?????????????????????????????????????? 若開啟OpenGL,那么2D將由OpenGL處理(OpenGL中2D是3D的子集)
????????? PROGRESS_VISIBILITY_ON = -1;???????????????????????? 進(jìn)度條可見?
????????? PROGRESS_VISIBILITY_OFF = -2;?????????????????????? 進(jìn)度條不可見?
????????? PROGRESS_INDETERMINATE_ON = -3;????????????? 開啟不確定模式?
????????? PROGRESS_INDETERMINATE_OFF = -4;???????????? 關(guān)閉不確定模式?
????????? PROGRESS_START = 0;??????????????????????????????????????? 第一進(jìn)度條的最小值?
????????? PROGRESS_END = 10000;???????????????????????????????????? 第一進(jìn)度條的最大值?
????????? PROGRESS_SECONDARY_START = 20000;????????? 第二進(jìn)度條的最小值?
????????? PROGRESS_SECONDARY_END = 30000;????????????? 第二進(jìn)度條的最大值?
?????? 經(jīng)常使用到的:?
??? 1、隱藏標(biāo)題欄?
??????? requestWindowFeature(Window.FEATURE_NO_TITLE);?
??? 2、在標(biāo)題欄顯示進(jìn)度條?
??????? requestWindowFeature(Window.FEATURE_PROGRESS);?
??????? setContentView(R.layout.progressbar_1);?
??????? setProgressBarVisibility(true);?
??????? final ProgressBar progressHorizontal = (ProgressBar)findViewById(R.id.progress_horizontal);
??????? setProgress(progressHorizontal.getProgress() * 100);?
??????? setSecondaryProgress(progressHorizontal.getSecondaryProgress()* 100);?
??? 3、使用自定義標(biāo)題欄?
??????? requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);?
??????? setContentView(R.layout.xxx);?
??????? getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.my_title_bar);
??? 4、清除標(biāo)題欄內(nèi)容,而區(qū)域保留?
??????? ((ViewGroup)getWindow().findViewById(com.android.internal.R.id.title_container)).removeAllViews();
??? 5、隱藏標(biāo)題欄?
??????? ((ViewGroup)getWindow(). findViewById(com.android.internal.R.id.title_container)).setVisibility(View.GONE);
??? 6、顯示標(biāo)題欄?
??????? ((ViewGroup)getWindow(). findViewById(com.android.internal.R.id.title_container)).setVisibility(View.VISIBLE);
window 屬性的使用:
window.requestWindowFeature(FLAG_NAME);
window.setFeatureInt(FLAG_NAME,FLAG_VALUE);
Window.LayoutParams類 基本屬性:
繼承來的屬性與常量
從 ViewManager.LayoutParams 繼承來的屬性:
android:layout_height
Specifies the basic height of the view.
android:layout_width
Specifies the basic width of the view.
從 ViewManager.LayoutParams繼承的常量:
FILL_PARENT
WRAP_CONTENT
MATCH_PARENT
兩個(gè)變量:
width
height
屬性及可用的常量定義
1. public int x;
如果忽略gravity屬性,那么它表示窗口的絕對(duì)X位置。
什么是gravity屬性呢?簡(jiǎn)單地說,就是窗口如何??俊?/p>
當(dāng)設(shè)置了 Gravity.LEFT 或 Gravity.RIGHT 之后,x值就表示到特定邊的距離。
2. public int y;
如果忽略gravity屬性,那么它表示窗口的絕對(duì)Y位置。
當(dāng)設(shè)置了 Gravity.TOP 或 Gravity.BOTTOM 之后,y值就表示到特定邊的距離。
3. public float horizontalWeight;
public float verticalWeight;
在縱/橫向上,為關(guān)聯(lián)的view預(yù)留了多少擴(kuò)展空間(像素)。如果是0,那么此view不能被拉伸。
其他情況下,擴(kuò)展空間(像素)將被widget所均分。
4. public int type;
窗口類型。有3種主要類型:
a)Applicationwindows:
取值在 FIRST_APPLICATION_WINDOW 和 LAST_APPLICATION_WINDOW 之間。
是通常的、頂層的應(yīng)用程序窗口。必須將 token 設(shè)置成 activity 的 token 。
b)Sub_windows:
取值在 FIRST_SUB_WINDOW 和 LAST_SUB_WINDOW 之間。
與頂層窗口相關(guān)聯(lián),token 必須設(shè)置為它所附著的宿主窗口的 token。
c)Systemwindows:
取值在 FIRST_SYSTEM_WINDOW 和 LAST_SYSTEM_WINDOW 之間。
用于特定的系統(tǒng)功能。它不能用于應(yīng)用程序,使用時(shí)需要特殊權(quán)限。
???? 下面定義了 type 的取值:
應(yīng)用程序窗口。
public static final int FIRST_APPLICATION_WINDOW = 1;
所有程序窗口的“基地”窗口,其他應(yīng)用程序窗口都顯示在它上面。
public static final int TYPE_BASE_APPLICATION?? =1;
普通應(yīng)喲功能程序窗口。token必須設(shè)置為Activity的token,以指出該窗口屬誰。
public static final int TYPE_APPLICATION?????? = 2;
用于應(yīng)用程序啟動(dòng)時(shí)所顯示的窗口。應(yīng)用本身不要使用這種類型。
它用于讓系統(tǒng)顯示些信息,直到應(yīng)用程序可以開啟自己的窗口。
public static final int TYPE_APPLICATION_STARTING = 3;
應(yīng)用程序窗口結(jié)束。
public static final int LAST_APPLICATION_WINDOW = 99;
子窗口。子窗口的Z序和坐標(biāo)空間都依賴于他們的宿主窗口。
public static final int FIRST_SUB_WINDOW?????? = 1000;
面板窗口,顯示于宿主窗口上層。
public static final int TYPE_APPLICATION_PANEL? = FIRST_SUB_WINDOW;
媒體窗口,例如視頻。顯示于宿主窗口下層。
public static final int TYPE_APPLICATION_MEDIA? = FIRST_SUB_WINDOW+1;
應(yīng)用程序窗口的子面板。顯示于所有面板窗口的上層。(GUI的一般規(guī)律,越“子”越靠上)
public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;
對(duì)話框。類似于面板窗口,繪制類似于頂層窗口,而不是宿主的子窗口。
public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;
媒體信息。顯示在媒體層和程序窗口之間,需要實(shí)現(xiàn)透明(半透明)效果。(例如顯示字幕)
public static final int TYPE_APPLICATION_MEDIA_OVERLAY? = FIRST_SUB_WINDOW +4;
子窗口結(jié)束。( End of types of sub-windows )
public static final int LAST_SUB_WINDOW??????? = 1999;
系統(tǒng)窗口。非應(yīng)用程序創(chuàng)建。
public static final int FIRST_SYSTEM_WINDOW??? = 2000;
狀態(tài)欄。只能有一個(gè)狀態(tài)欄;它位于屏幕頂端,其他窗口都位于它下方。
public static final int TYPE_STATUS_BAR??????? =? FIRST_SYSTEM_WINDOW;
搜索欄。只能有一個(gè)搜索欄;它位于屏幕上方。
public static final int TYPE_SEARCH_BAR??????? = FIRST_SYSTEM_WINDOW+1;
電話窗口。它用于電話交互(特別是呼入)。它置于所有應(yīng)用程序之上,狀態(tài)欄之下。
public static final int TYPE_PHONE??????????? = FIRST_SYSTEM_WINDOW+2;
系統(tǒng)提示。它總是出現(xiàn)在應(yīng)用程序窗口之上。
public static final int TYPE_SYSTEM_ALERT????? =? FIRST_SYSTEM_WINDOW +3;
鎖屏窗口。
public static final int TYPE_KEYGUARD????????? = FIRST_SYSTEM_WINDOW +4;
信息窗口。用于顯示toast。
public static final int TYPE_TOAST??????????? = FIRST_SYSTEM_WINDOW +5;
系統(tǒng)頂層窗口。顯示在其他一切內(nèi)容之上。此窗口不能獲得輸入焦點(diǎn),否則影響鎖屏。
public static final int TYPE_SYSTEM_OVERLAY??? =? FIRST_SYSTEM_WINDOW +6;
電話優(yōu)先,當(dāng)鎖屏?xí)r顯示。此窗口不能獲得輸入焦點(diǎn),否則影響鎖屏。
public static final int TYPE_PRIORITY_PHONE??? =? FIRST_SYSTEM_WINDOW +7;
系統(tǒng)對(duì)話框。(例如音量調(diào)節(jié)框)。
public static final int TYPE_SYSTEM_DIALOG???? =? FIRST_SYSTEM_WINDOW +8;
鎖屏?xí)r顯示的對(duì)話框。
public static final int TYPE_KEYGUARD_DIALOG?? =? FIRST_SYSTEM_WINDOW +9;
系統(tǒng)內(nèi)部錯(cuò)誤提示,顯示于所有內(nèi)容之上。
public static final int TYPE_SYSTEM_ERROR????? =? FIRST_SYSTEM_WINDOW +10;
內(nèi)部輸入法窗口,顯示于普通UI之上。應(yīng)用程序可重新布局以免被此窗口覆蓋。
public static final int TYPE_INPUT_METHOD????? =? FIRST_SYSTEM_WINDOW +11;
內(nèi)部輸入法對(duì)話框,顯示于當(dāng)前輸入法窗口之上。
public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12;
墻紙窗口。
public static final int TYPE_WALLPAPER???????? = FIRST_SYSTEM_WINDOW +13;
狀態(tài)欄的滑動(dòng)面板。
public static final int TYPE_STATUS_BAR_PANEL?? = FIRST_SYSTEM_WINDOW +14;
系統(tǒng)窗口結(jié)束。
public static final int LAST_SYSTEM_WINDOW???? = 2999;
5. public int memoryType;
指出窗口所使用的內(nèi)存緩沖類型。默認(rèn)為 NORMAL 。
下面定義了 memoryType 的取值:
窗口緩沖位于主內(nèi)存。
public static final int MEMORY_TYPE_NORMAL = 0;
窗口緩沖位于可以被DMA訪問,或者硬件加速的內(nèi)存區(qū)域。
public static final int MEMORY_TYPE_HARDWARE = 1;
窗口緩沖位于可被圖形加速器訪問的區(qū)域。
public static final int MEMORY_TYPE_GPU = 2;
窗口緩沖不擁有自己的緩沖區(qū),不能被鎖定。緩沖區(qū)由本地方法提供。
public static final int MEMORY_TYPE_PUSH_BUFFERS = 3;
6.? public int flags;
行為選項(xiàng)/旗標(biāo),默認(rèn)為 none .
下面定義了 flags 的取值:
窗口之后的內(nèi)容變暗。
public static final int FLAG_DIM_BEHIND?????? = 0x00000002;
窗口之后的內(nèi)容變模糊。
public static final int FLAG_BLUR_BEHIND?????? = 0x00000004;
不許獲得焦點(diǎn)。
public static final int FLAG_NOT_FOCUSABLE???? = 0x00000008;
不接受觸摸屏事件。
public static final int FLAG_NOT_TOUCHABLE???? = 0x00000010;
當(dāng)窗口可以獲得焦點(diǎn)(沒有設(shè)置 FLAG_NOT_FOCUSALBE 選項(xiàng))時(shí),仍然將窗口范圍之外的點(diǎn)設(shè)備事件(鼠標(biāo)、觸摸屏)發(fā)送給后面的窗口處理。否則它將獨(dú)占所有的點(diǎn)設(shè)備事件,而不管它們是不是發(fā)生在窗口范圍內(nèi)。
public static final int FLAG_NOT_TOUCH_MODAL?? = 0x00000020;
如果設(shè)置了這個(gè)標(biāo)志,當(dāng)設(shè)備休眠時(shí),點(diǎn)擊觸摸屏,設(shè)備將收到這個(gè)第一觸摸事件。
通常第一觸摸事件被系統(tǒng)所消耗,用戶不會(huì)看到他們點(diǎn)擊屏幕有什么反應(yīng)。
public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;
當(dāng)此窗口為用戶可見時(shí),保持設(shè)備常開,并保持亮度不變。
public static final int FLAG_KEEP_SCREEN_ON??? = 0x00000080;
窗口占滿整個(gè)屏幕,忽略周圍的裝飾邊框(例如狀態(tài)欄)。此窗口需考慮到裝飾邊框的內(nèi)容。
public static final int FLAG_LAYOUT_IN_SCREEN?? =0x00000100;
允許窗口擴(kuò)展到屏幕之外。
public static final int FLAG_LAYOUT_NO_LIMITS?? =0x00000200;
窗口顯示時(shí),隱藏所有的屏幕裝飾(例如狀態(tài)條)。使窗口占用整個(gè)顯示區(qū)域。
public static final int FLAG_FULLSCREEN???? = 0x00000400;
此選項(xiàng)將覆蓋FLAG_FULLSCREEN選項(xiàng),并強(qiáng)制屏幕裝飾(如狀態(tài)條)彈出。
public static final int FLAG_FORCE_NOT_FULLSCREEN?? =0x00000800;
抖動(dòng)。指 對(duì)半透明的顯示方法。又稱“點(diǎn)透”。圖形處理較差的設(shè)備往往用“點(diǎn)透”替代Alpha混合。
public static final int FLAG_DITHER?????????? = 0x00001000;
不允許屏幕截圖。
public static final int FLAG_SECURE?????????? = 0x00002000;
一種特殊模式,布局參數(shù)用于指示顯示比例。
public static final int FLAG_SCALED?????????? = 0x00004000;
當(dāng)屏幕有可能貼著臉時(shí),這一選項(xiàng)可防止面頰對(duì)屏幕造成誤操作。
public static final int FLAG_IGNORE_CHEEK_PRESSES?? = 0x00008000;
當(dāng)請(qǐng)求布局時(shí),你的窗口可能出現(xiàn)在狀態(tài)欄的上面或下面,從而造成遮擋。當(dāng)設(shè)置這一選項(xiàng)后,窗口管理器將確保窗口內(nèi)容不會(huì)被裝飾條(狀態(tài)欄)蓋住。
public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;
反轉(zhuǎn)FLAG_NOT_FOCUSABLE選項(xiàng)。
如果同時(shí)設(shè)置了FLAG_NOT_FOCUSABLE選項(xiàng)和本選項(xiàng),窗口將能夠與輸入法交互,允許輸入法窗口覆蓋;
如果FLAG_NOT_FOCUSABLE沒有設(shè)置而設(shè)置了本選項(xiàng),窗口不能與輸入法交互,可以覆蓋輸入法窗口。
public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;
如果你設(shè)置了FLAG_NOT_TOUCH_MODAL,那么當(dāng)觸屏事件發(fā)生在窗口之外事,可以通過設(shè)置此標(biāo)志接收到一個(gè) MotionEvent.ACTION_OUTSIDE事件。注意,你不會(huì)收到完整的down/move/up事件,只有第一次down事件時(shí)可以收到 ACTION_OUTSIDE。
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
當(dāng)屏幕鎖定時(shí),窗口可以被看到。這使得應(yīng)用程序窗口優(yōu)先于鎖屏界面??膳浜螰LAG_KEEP_SCREEN_ON選項(xiàng)點(diǎn)亮屏幕并直接顯示在鎖屏界面之前??墒褂肍LAG_DISMISS_KEYGUARD選項(xiàng)直接解除非加鎖的鎖屏狀態(tài)。此選項(xiàng)只用于最頂層的全屏幕窗口。
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
請(qǐng)求系統(tǒng)墻紙顯示在你的窗口后面。窗口必須是半透明的。
public static final int FLAG_SHOW_WALLPAPER = 0x00100000;
窗口一旦顯示出來,系統(tǒng)將點(diǎn)亮屏幕,正如用戶喚醒設(shè)備那樣。
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;
解除鎖屏。只有鎖屏界面不是加密的才能解鎖。如果鎖屏界面是加密的,那么用戶解鎖之后才能看到此窗口,除非設(shè)置了FLAG_SHOW_WHEN_LOCKED選項(xiàng)。
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
鎖屏界面淡出時(shí),繼續(xù)運(yùn)行它的動(dòng)畫。
public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000;
以原始尺寸顯示窗口。用于在兼容模式下運(yùn)行程序。
public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;
用于系統(tǒng)對(duì)話框。設(shè)置此選項(xiàng)的窗口將無條件獲得焦點(diǎn)。
public static final int FLAG_SYSTEM_ERROR = 0x40000000;
7. public int softInputMode;
軟輸入法模式選項(xiàng):
以下選項(xiàng)與 softInputMode 有關(guān):
軟輸入?yún)^(qū)域是否可見。
public static final int SOFT_INPUT_MASK_STATE = 0x0f;
未指定狀態(tài)。
public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;
不要修改軟輸入法區(qū)域的狀態(tài)。
public static final int SOFT_INPUT_STATE_UNCHANGED = 1;
隱藏輸入法區(qū)域(當(dāng)用戶進(jìn)入窗口時(shí))。
public static final int SOFT_INPUT_STATE_HIDDEN = 2;
當(dāng)窗口獲得焦點(diǎn)時(shí),隱藏輸入法區(qū)域。
public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3;
顯示輸入法區(qū)域(當(dāng)用戶進(jìn)入窗口時(shí))。
public static final int SOFT_INPUT_STATE_VISIBLE = 4;
當(dāng)窗口獲得焦點(diǎn)時(shí),顯示輸入法區(qū)域。
public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5;
窗口應(yīng)當(dāng)主動(dòng)調(diào)整,以適應(yīng)軟輸入窗口。
public static final int SOFT_INPUT_MASK_ADJUST = 0xf0;
未指定狀態(tài),系統(tǒng)將根據(jù)窗口內(nèi)容嘗試選擇一個(gè)輸入法樣式。
public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00;
當(dāng)輸入法顯示時(shí),允許窗口重新計(jì)算尺寸,使內(nèi)容不被輸入法所覆蓋。
不可與SOFT_INPUT_ADJUSP_PAN混合使用,如果兩個(gè)都沒有設(shè)置,系統(tǒng)將根據(jù)窗口內(nèi)容自動(dòng)設(shè)置一個(gè)選項(xiàng)。
public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;
輸入法顯示時(shí)平移窗口。它不需要處理尺寸變化,框架能夠移動(dòng)窗口以確保輸入焦點(diǎn)可見。
不可與SOFT_INPUT_ADJUST_RESIZE混合使用;如果兩個(gè)都沒設(shè)置,系統(tǒng)將根據(jù)窗口內(nèi)容自動(dòng)設(shè)置一個(gè)選項(xiàng)。
public static final int SOFT_INPUT_ADJUST_PAN = 0x20;
當(dāng)用戶轉(zhuǎn)至此窗口時(shí),由系統(tǒng)自動(dòng)設(shè)置,所以你不要設(shè)置它。
當(dāng)窗口顯示之后該標(biāo)志自動(dòng)清除。
public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;
8. public int gravity;
gravity 屬性。什么是gravity屬性呢?簡(jiǎn)單地說,就是窗口如何停靠。
9. public float horizontalMargin;
水平邊距,容器與widget之間的距離,占容器寬度的百分率。
10. public float verticalMargin;
縱向邊距。
11. public int format;
期望的位圖格式。默認(rèn)為不透明。參考android.graphics.PixelFormat。
12. public int windowAnimations;
窗口所使用的動(dòng)畫設(shè)置。它必須是一個(gè)系統(tǒng)資源而不是應(yīng)用程序資源,因?yàn)榇翱诠芾砥鞑荒茉L問應(yīng)用程序。
13. public float alpha = 1.0f;
整個(gè)窗口的半透明值,1.0表示不透明,0.0表示全透明。
14. public float dimAmount = 1.0f;
當(dāng)FLAG_DIM_BEHIND設(shè)置后生效。該變量指示后面的窗口變暗的程度。1.0表示完全不透明,0.0表示沒有變暗。
15. public float screenBrightness = -1.0f;
用來覆蓋用戶設(shè)置的屏幕亮度。表示應(yīng)用用戶設(shè)置的屏幕亮度。從0到1調(diào)整亮度從暗到最亮發(fā)生變化。
16. public IBinder token = null;
窗口的標(biāo)示符。( Identifier for this window. This will usually be filled in for you. )
17. public String packageName = null;
此窗口所在的包名。
18. public int screenOrientation =ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
屏幕方向,參見android.content.pm.ActivityInfo#screenOrientation。
19. 在兼容模式下,備份/恢復(fù)參數(shù)所使用的內(nèi)部緩沖區(qū)。
public int[] mCompatibilityParamsBackup = null;
Window.LayoutParams的使用:
e.g.
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
參考:
Android之基本常見知識(shí) getwindow() requestWindowFeature()方法