跳到主要內容

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 還是不錯的選擇啦!(但是滿難用就是了)



留言

這個網誌中的熱門文章

如何把 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:...

探討 LayoutInflater 的 inflate method

        在 Android 程式裡要動態新增 View,最直接的方法就是使用 LayoutInflater 提供的 inflate method。比較常用的有以下兩個 method: inflate(int resource, ViewGroup root) inflate(int resource, ViewGroup root, boolean attachToRoot)         第一個參數 resource,就是 layout xml file,如 R.layout.your_file。第二個參數 root,指的是這個 inflate 的 view,要成為哪個 view 的 child view。最後一個參數 attachToRoot 是 inflate 的 view 是否要 attach 到 root view,這會影響到回傳的是哪個 view。假如 attachToRoot 為 true,則最後回傳的 view 為 root view (就是第二個參數的 view);反之就是回傳 inflate 的 view。         第二個參數 ViewGroup root 需要特別說明一下,因為這會影響到如何 inflate 新的 view 出來。android 的 view 是有階層 (hierarchy) 的,因此 parent view 的屬性 (attribute) 會影響到 child view 。假如你是如以下兩種方式使用 inflate method的話: View view1 = LayoutInflater.from(mContext).inflate(R.layout.your_file, null) View view2 = LayoutInflater.from(mContext).inflate(R.layout.your_file, null, false)         因為沒有 root view,系統沒辦法把 inflate view 的屬性正確設定,因此系統會把 inflate view 的屬性設為 null,這會導致 inflate ...

動態更新 ViewPager 的目前顯示頁面

        ViewPager 在 Android 裡是一個很好用的元件,使用者只要左右滑動,就可以顯示多頁的資訊。假如你的資料是從網路取得,如圖片,當使用者滑到還沒載入完成的頁面時,該怎麼辦呢?         雖然 ViewPager 會動態更新頁面,但是當下顯示的頁面是不會更新的。要達到上述的目的,我們要做一些事。ViewPager 主要是由 PagerAdapter 來處理內部的資料的,因此我們要從它下手。         PagerAdapter 有一個 method:getItemPosition。看 API 說明應該是用來判斷目前頁面的內容位置是否有變,但是也可以用它來滿足我們的要求,pseudo code 如下: public int getItemPosition(Object object) {         if ( 你的資料準備好了 )         {                 return POSITION_NONE;         }         else         {                 // 資料還沒準備好,此頁面維持不變                 return POSITION_UNCHANGED;         } }         雖然 overwrite 了 getItemPosition,但是這個 method 並不是我們主動去 invoke 的,PagerAdapter 提供了另一個 method 可以讓我們通...