2019-11-06

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 詳解(二)---詳解四大函數(shù)

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()方法

Android 中的Activity、Window、View之間的關(guān)系

Android 系統(tǒng)(48)---WindowManager.LayoutParams 詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容