跳到主要內容

透明背景的 AlertDialog

        Android dialog 預設都會有一個背景底色,要怎麼把它去掉呢?其實直接改 AlertDialog 的 style 就可以了,但我改好久…以下的範例是使用了 Support v7 AppCompat 的 theme,其他 theme 我不知道可不可以,有興趣的人可以試試看。

<style name="TransparentDialog" parent="@style/Base.Theme.AppCompat.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:alertDialogStyle">@style/TransparentDialog.Color</item>
</style>

<style name="TransparentDialog.Color" parent="@style/Base.Theme.AppCompat.Dialog">
    <item name="android:fullDark">@android:color/transparent</item>
    <item name="android:topDark">@android:color/transparent</item>
    <item name="android:centerDark">@android:color/transparent</item>
    <item name="android:topBright">@android:color/transparent</item>
</style>
參考資料:

1. Stack Overflow: Dialog with transparent background in Android

這個網誌中的熱門文章

如何把 Status Bar 變透明

Android 從 4.4 (KitKat, api level 19) 後才支援這個功能, 到了 5.0 (Lollipop, api level 21) 自訂性更高, 可以讓我們設定各種顏色, 當然也包含透明色。以下分別介紹如何使用這兩種版本的方法。

方法1: 利用 attribute "android:windowTranslucentStatus", 在 style.xml 加上這個 attribute 就好。要注意的是 Android 版本要在 4.4 以上才可以用這個 attribute:

<resources> <!-- Base application theme for API 19+. This theme completely replaces AppTheme from res/values/styles.xml on API 19+ devices. --> <style name="AppTheme" parent="@style/AppBaseTheme"> <!-- API 19 theme customizations can go here. --> <item name="android:windowTranslucentStatus">true</item> </style> </resources>         下面的圖分別為 4.4 跟 5.0 的手機使用這個 attribute 的結果:


        因為設定了這個 attribute, 畫面會從 status bar 下方開始畫。要解決這個有兩種方法, 第一個是在 layout 畫面設定 attribute "android:fitsSystemWindows"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to…

在 Fragment 裡使用 ViewPager 搭配 FragmentPagerAdapter

Fragment 是個強大的東西,可以想成 Activity 的子頁面,可隨時替換頁面內容(但使用起來還滿麻煩的…)。這麼強大的東西,在 ViewPager 當然也會提供 Fragment 的版本。在官方文件就有一個 PagerAdapter 的實作:FragmentPagerAdapter,可以用 Fragment 來當成每個 ViewPager 的子頁。FragmentPagerAdapter 的官方文件中也有提供 sample code。

        但我自己參考 sample code 寫出來的效果卻怪怪的,ViewPager 裡子頁面的 lifecycle 竟然沒有跟著父 Fragment ,看起來比較像是跟著 Activity。仔細看 sample code 才發現,它是在 Activity 裡使用 ViewPager + FragmentPagerAdapter。那要如何使用在 Fragment 呢?

        其實只要改一行 code 就可以了。 sample code 裡的
mAdapter = new MyAdapter(getSupportFragmentManager()); 只要改成
mAdapter = new MyAdapter(Fragment.getChildFragmentManager()); 就可以囉 ~~

        由於 getChildFragmentManager() api level 17+ 才有的東西,而 Fragment 是 11+ 才有,不想定太高的 api level 可以使用 support v4 library,怎麼使用就不多說啦。

參考資料:

support v4 Fragment:
http://developer.android.com/intl/zh-tw/reference/android/support/v4/app/Fragment.html

support v4  FragmentPagerAdapter:
http://developer.android.com/intl/zh-w/reference/android/support/v4/app/FragmentPagerAdapter.html


ADT 開新專案不使用 support.v7.appcompat

ADT 愈來愈煩了…不知道從哪一版開始,我目前版本是 Android SDK Tools 22.6.4,Android SDK Platform-Tools 19.0.2,只要開新專案選 Blank Activity,預設 MainActivity 就會 extends AtionBarActivity 並使用 Fragment 顯示頁面,而且 project list 還會多一個 appcompat_v7,可是我一點都不喜歡 Fragment 阿!!!但是選專案 Activity 時,多了一個 Empty Activity,我選它總可以了吧!


        很好,總算是 extends Activity了,但還是一樣會多一個 appcompat_v7 的專案。這看了真的很礙眼,我索性就把它刪了。結果刪掉後,反而新專案怎麼 build 都失敗。看一下錯誤都是在 style.xml



        看一下錯誤訊息,是No resource found that matches the given name 'Theme.AppCompat.Light'。因為這是在 support v7 appcompat 裡的東西,把它砍了當然就找不到,build 失敗也是正常的,這裡教大家如何能順利 build 這個新專案:

1. 對專案按右鍵 --> Properties --> 左邊 Panel 選 Android --> 右邊 Scroll bar 拉到最下面 -->             Library 的地方把 appcompat_v7 這個 project library 給 remove 掉 --> Apply and OK。

2. 把 style.xml 裡的 parent theme 都改成原有的 theme,例如 android:Theme.Light

3. 重新 build project --> 打完收工!

        這是不想用 Fragment 的情形才要這樣做啦,要是你的 app 想要呈現多頁的資訊的話,Fragment + ActionBar/ViewPager 還是不錯的選擇啦!(但是滿難用就是了)