Android支持自定義窗口樣式:
1)首先,建立價值;資源中的樣式;
示例:
drawable/filled_box.xml
& ltshape xmlns:Android = "/apk/RES/Android " & gt;
& ltpadding Android:left = " 10dp " Android:top = " 10dp " Android:right = " 10dp " Android:bottom = " 10dp "/& gt;
2)用兩種方式設置當前活動的屬性:1。向清單文件中的指定活動添加屬性。
Android:Theme = " @ Android:style/主題。自定義對話框.2.在程序中添加語句set theme(r . style . theme _ custom dialog);
PS1:如果Acticity只顯示為默認對話框,跳過第壹步,只需添加屬性:Android:theme = " @ Android:style/theme。對話框”或者在程序中添加設置主題(Android.r.style.theme _ dialog)。
PS2:創建對話框的其他方法:創建應用程序。對話框類或創建應用程序。AlertDialog類
下壹個研究:當前活動打開後,能動態修改它的樣式嗎?
測試中發現onCreate()事件中setTheme()的添加必須在setContentView()之前,否則指定的樣式不會生效。
2.自定義標題
Android除了可以為指定的活動設置顯示風格,還可以為指定的活動設置壹些特效,比如自定義標題、無標題的活動或者添加壹個圖標。
有趣的是,這些特效並不是妳想什麽時候設置就什麽時候設置的。妳需要在活動展示之前向系統申請要展示的特效,以便在後面的程序中設置這些特效。(這是否沒有必要還有待研究)
為活動設置自定義標題的過程:
1)為自定義標題創建壹個布局(custom _ Title _ 1.xml)。
& ltrelative layout xmlns:Android = "/apk/RES/Android " Android:id = " @+id/screen "
Android:layout _ width = " fill _ parent " Android:layout _ height = " fill _ parent "
Android:orientation = " vertical " & gt;
& lttextview Android:id = " @+id/left _ text " Android:layout _ width = " wrap _ content "
Android:layout _ height = " wrap _ content "
Android:layout _ alignParentLeft = " true "
Android:text = " Left "/& gt;
& lttextview Android:id = " @+id/right _ text " Android:layout _ width = " wrap _ content "
Android:layout _ height = " wrap _ content "
Android:layout _ alignParentRight = " true "
Android:text = " Right "/& gt;
2)為活動設置自定義標題效果,並指定標題的布局:
在onCreate()事件中添加以下內容:
requestWindowFeature(窗口。特征_自定義_標題);
setContentView(r . layout . custom _ title);
getWindow()。setFeatureInt(窗口。FEATURE_CUSTOM_TITLE,r . layout . CUSTOM _ TITLE _ 1);
這三個語句的順序不能顛倒,依次是申請特效、創建視圖、設置特效屬性。requestWindowFeature相當於getWindow()。請求功能()。
3)標題需要修改的地方,獲取left_text或right_text設置即可。
下壹項研究:活動的其他顯示效應
窗口中還有其他功能,如功能_上下文_菜單、功能_無_標題、功能_左_圖標等。,有待進壹步研究。
1.促進
這個實現很簡單,就是在啟動壹個新的活動或服務後,只需添加壹個finish()語句,它會主動將當前活動從歷史堆棧中移除,這樣回退操作就不會打開當前活動。
在做這個實驗的時候,我發現了壹個開發Android程序要註意的小問題:在添加壹個新活動的時候,不能只添加壹個類。確保在清單文件中添加活動的描述。(這個簡單的功能以後應該會加到google上。)
“android中的點:名稱”的含義:首先,manifest會有壹個默認指定的包屬性,比如“com.android.sample”。如果我們添加的activity的實現也在這個包下,那麽android:name就是實現的類名,加不加都無所謂。會自動找到實現,比如forwardtarget,那麽android:name可以寫成forwardtarget或者。轉發目標。唯壹的區別是,如果活動的實現是在默認包的壹個子包中,那麽前壹點特別重要。例如,如果活動的實現是com . Android . sample app.forwardtarget,那麽android:name必須寫成. app . forward target或com . Android . sample . app . forward target..如果妳只是寫app.forwardtarget,通常編輯器會提示找不到類,但很遺憾,妳恰好有壹個名為app.forwardtarget的類,所以妳要等待運行時報錯。
所以建議只要是默認包下的類,不管是不是在子包裏,前面都要加壹個點。現在當前的實現在默認包下。
2.堅持的
這裏的持久化實際上是本地配置文件的讀寫。實現方法是通過Activity.getPreferences(int)獲取SharedPreferences對象,然後操作配置文件的讀寫。以下幾點值得註意:
1)activity . get preferences(int模式)等效於content . getsharedpreferences(string filename,int模式),其中filename是當前類的名稱。例如,在PersistentTest類中調用getPreferences(0)等效於調用get preferences(“persistent test”,0)。如果不想用類名作為文件名,可以直接調用getSharedPreferences方法,自己指定配置文件的名稱。
2)2)模式值的定義:
MODE_PRIVATE = 0,表示當前配置文件是私有的,只有當前應用程序可以訪問它。
MODE_WORLD_READABLE = 1,表示當前配置文件可以被其他應用程序讀取。
Mode _ world _ writable = 2,表示當前配置文件可以被其他應用程序寫入。
配置文件想讀寫怎麽辦,呵呵,mode _ world _ readable &;Mode _ world _ writable,我真懷疑以前設計android的人是做C/C++的。
3)SharedPreferences是壹個非常有趣的實現。讀取數據時,可以直接使用get方法,但是寫入數據時,使用set方法是沒有用的。呵呵,第壹次用這個類,妳會覺得只會讀不會寫。如果要寫數據,需要使用editor()方法(為什麽不用getEditor()?看來設計者壹定是在做C/C++)才能得到SharedPreferences。編輯器類,然後使用該類的put方法編寫文件。為什麽要這麽做?好久沒看到設計模式了。不知道他用的是什麽高級模式。等我有時間看到它的實現後再做研究。
4)在這個實現中,讀文件在onResume()中,寫文件在onPause()中。妳為什麽這麽做?從字面上看,似乎只有在恢復和暫停時才會執行。程序第壹次創建時會讀取文件嗎?讓我們看看活動的生命周期,我們會發現這樣做的巧妙之處:
看到了吧,活動運行前後,無論狀態如何變化,onResume()和onPause()都會被執行。與其誇這生命周期設計的巧妙,不如誇它實現的巧妙。這種匠心不是說說而已。如果有時間,看看MFC中壹個窗口或對話框的生命周期,就知道巧妙的含義了。我們能挽救多少東西!所以值得記住的是,在android中,運行前後必須執行的語句應該放在onResume()和onPause()中。
4)最後說壹點安卓不開心的地方:drawable,什麽鬼!把壹個文件放在res/drawable中,訪問時就是drawable/name。如果妳在values中創建了壹個drawable變量,那麽在訪問它的時候也是drawable/name。比如在drawable目錄下放壹個red.xml文件,訪問的時候是@drawable/red。如果創建壹個drawable變量red,訪問也是@drawable/red,這完全是兩碼事。雖然最新的編輯器會提示重名,但是找起來確實不方便,尤其是drawable變量,可以放在壹個abc.xml裏面
這個實驗描述了活動之間的另壹種切換模式。通常活動的切換方式是,活動1通過startActivity切換到活動2,活動2通過startActivity切換到其他活動。但是有時候我們需要開始壹個新的活動來獲取用戶的輸入,然後再回到原來的活動。例如,活動是壹個地址簿列表。我們通過添加按鈕打開另壹個活動,讓用戶輸入新的聯系人,輸入後返回到地址簿列表。
這時候我們可以通過startActivityforresult (int,int)方法啟動壹個新的活動,新的活動通過setResult(int,intent)方法返回到舊的活動,這樣就會觸發舊活動的onactivityresult (int,int,Intent)方法,我們可以在這個方法的實現中處理返回事件。
StartActivityforresult (int,int),其中int是請求代碼,也是onActivityResult的第壹個參數。通常壹個活動不僅會觸發壹個獲取事件,比如上面提到的通訊錄,還可能會有壹個添加聯系人的事件。可能會有壹個事件修改聯系人或者給指定聯系人添加電話,但是我們只有壹個方法,所以需要這樣壹個請求代碼來區分返回的是哪個事件。這個值是用戶自己定義的,完全由用戶自己管理,非常人性化。
SetResult(int,Intent),其中int是結果代碼,表示返回的狀態,也是onActivityResult的第二個參數。這個參數需要特別註意。android為這個值提供了三個默認常量。先看前兩個,result _ cancelled和RESULT_OK。這個從字面上很好理解。壹個是操作取消,壹個是操作成功返回。當用戶按下返回鍵時,結果代碼為result _ cancelled。但是如果我們看它們對應的值,就會發現奇怪的地方,result _ cancelled = 0,RESULT_OK=-1!!!在其他系統中,OK通常是1,而在android中,它是-1。為什麽?我們來看第三個默認常量,RESULT_FIRST_USER=1。明白了!Android把所有大於0的數字留給用戶自己處理。多有人情味!但是需要註意的是,正如我前面所說,大部分系統喜歡返回大於0為正確返回,小於0為錯誤返回,所以很多人(包括我)喜歡用if(結果> 0)表示成功返回,這在android中是不允許的,所以請特別註意!
另外,在這個節目中,我們可以看到另外壹件事。關於TextView,如果我們想改變它的內容,比如添加新的字段,我們需要使它變長。方法為mtextview . settext(mtextview . gettext()、textview . buffer type . editable);
修改內容的方法是通過TextView.getText()獲取可編輯對象,然後編輯可編輯對象。Editable類似於StringBuffer,編輯後會直接體現在TextView中,不需要設置text();
2.SaveRestoreState
我完全不明白這個演示的效果。似乎與onSaveInstanceState和TextView的android:freezesText屬性有關,但具體效果還沒有研究過。以後再研究吧。
3.半透明的
Android為透明效果提供了內置主題:Android: style/theme。半透明的。妳只需要將當前活動的主題設置為這個主題,就可以達到完全透明的效果。
如果想要半透明,可以添加繼承主題的樣式,如下所示:
#e0000000
另外,API Demo中提供了另壹個例子。在不繼承內置主題的情況下,完全可以創建新的樣式來實現透明,同時還可以添加壹些其他的特效,比如虛化。