2018年5月24日 星期四

[路徑]\android.jar is neither a directory nor file (type=1).

這是Android SDK更新檔案失敗時經常會做的處置。

仔細看...SDK Manager更新個別Plateform檔案的方式是「把舊的砍掉」「新建一個」「把新的改成跟舊的一樣的名字」。

但如果更新的過程失敗,例如「新建一個」失敗?它並不會把砍掉的Plateform檔案還原,而是就任由它那樣空置在那裏。

這時候IDE就會發現專案找不到相對應的Plateform檔案,但關於「Builder/Plateform」的名單卻沒有更新,使用者就會看到IDE一直在那邊試圖讀取在SDK中已經不存在的Plateform檔案。


退出IDE、重新更新一次SDK,其實就可以輕易的修好這個Bug。

(同樣的理由,有時候運行的很正常的專案有一天會忽然「沒有指定任何Plateform」,就是因為更新的過程中,它刪除了Plateform檔但又一直無法更新成功,所以就先讓IDE更新了Plateform名單,但之後很巧妙神奇地完成了Plateform檔更新,也再次更新了Plateform名單。)

2018年5月10日 星期四

【Android Line Login API】Eclipse上使用Line Login API時碰到Activit not found的解決辦法

呼叫Line的功能會使用到「com.linecorp.linesdk.auth.internal.LineAuthenticationActivity」和「com.linecorp.linesdk.auth.internal.LineAuthenticationCallbackActivity」。

可以在aar檔解壓縮後的Library內找到AndroidManifest.xml檔,並用標準Eclipse的方式匯入。

(Line SDK有提供Maven版。但我一樣沒有用。)


在Library內的AndroidManifest檔下有這兩個設定值,將它們完整複製下來、貼到自己的工作專案下,(光是直接import並不夠,)然後每個「android:exported」都改為true。

接著就可以正常使用了。



        <activity
            android:name="com.linecorp.linesdk.auth.internal.LineAuthenticationActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="false"
            android:launchMode="singleTop"
            android:theme="@style/LineSdk_AuthenticationActivity" />
        <activity
            android:name="com.linecorp.linesdk.auth.internal.LineAuthenticationCallbackActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="lineauth" />
            </intent-filter>
        </activity>

不要搬移這段設定值,程式依然可以正常執行,但是當進行登入時,系統層的logcat訊息會跳出「Activiy」找不到的警訊然後中斷執行,(在APP層的logcat中看不到。)

還在使用Eclipse的人有興趣可以試試看。


會注意到這點,是因為使用FCM時也碰到類似的情況:必須要把Library中的Manifest檔設定內容搬到APP中的Manifest檔中。

感謝Dandar3寫的說明文件讓我有解決這個問題的基礎。(歡迎大家去Github上拜訪他一下。)

2018年5月9日 星期三

【Android Fragment】Fragment的優缺點

先說缺點。

缺點當然是麻煩!

不單單是設計上,如果要在Fragment中插入Fragment,一定不能走XML,必須要在主Fragment中呼叫getChildFragmentSupport,然後用Java程式碼將子Fragment一個一個插入主Fragment中。

(這很自打嘴巴。因為Google自己當初用非常強勢的方式規劃了一個用XML為主的設計流程思維,現在又告訴大家「這個時候要丟掉這個東西。」)



優點主要有兩個....

一是介面可以大範圍的元件化。如果介面內的資料需要複雜的初始化、但又要可以動態的顯示、隱藏、銷毀(不再使用),過去需要設計複雜的Handler,而且還要處理HandlerLieaking(一種送出的Handler被主執行序完全忽略不執行的狀況),但如果使用Fragment就可以確保「隨時都能插入或移除介面元件」甚至還有「複雜的初始化」。

(FragmentManager可以從任何地方任何時刻向主執行序發出一個修改介面的請求。不管是add/replace/remove一個Fragment,或將一個現存Fragment用簡單的「先detach、再attach」來刷新內容。)


二是延續一,讓設計者可以用介面元件更新控制「流程」或「功能的週期」。一個執行序需要有更明確且簡單的控制判斷時,可以使用Fragment。例如執行序中途需要更新畫面(例如一個TextView),但TextView會有不在畫面上的時刻,如果用Activity層來控制執行序,Handler的設計需求會更複雜,如果改用Fragment,執行序可以直接判斷Fragment的生命週期即可。

(一般的View沒有生命週期,如果要用是否為「null」,就需要獨立製作資料的存取功能,如果用Fragment,則只要用Frgament當存放資料的容器即可,當Fragment需要使用資料時,也只需要再「自己」身上找資料即可。)