2017年11月30日 星期四

找出 non present 的 device

之前介紹過 Setup API 與其使用方式,可以找出系統上的 device 並對其操作,但是它會找出所有曾經被安裝過的 device,包括目前正連在電腦上的與未連接在電腦上的 device,若是想找出目前沒有被連接在電腦上,也就是 non present 的 device,並沒有甚麼簡單的方法可以達成,例如本來想看看 SetupDiGetDeviceRegistryProperty API 能不能查出 device 是不是 non-present,但可惜沒有辦法

Setup API 沒辦法,但是其他 API 可以,後來找到 CM_Get_DevNode_Status 這個 API,可以查詢 devnode 的 status,而 non present 的 device 因為沒有 devnode,所以對 non present 的 device 這個 API 會回 CR_NO_SUCH_DEVNODE,這樣就可以區分出用 Setup API 取得的 device 是不是 non present

2017年11月17日 星期五

Android ViewPager 元件產生滑動效果

ViewPager 是一個可以讓螢幕產生滑動效果的原件,通常是搭配 fragment,可以讓各個 fragment 在螢幕中左右滑動

效果如下

螢幕轉向時 FragmentPagerAdapter 如何處理 fragment

最近在 Android 開發中用到 Fragment、ViewPager 跟 FragmentPagerAdapter 的組合,並且需要在 activity 中取得當前顯示的 fragment,原本的做法是在 getItem method 中將 fragment 用 position 當成 index 儲存起來,之後在繼承 FragmentPagerAdapter 的 class 中新增一個 getFragment(int position) method 取得 fragment

原本運作是沒甚麼問題,但是當螢幕轉向之後取得的 fragment 都變成 null,後來才發現 fragment 會被 FragmentManager 儲存在內部,當螢幕轉向時,並不會重新 create 一個 fragment 實體,而是會重用之前 create 過的 fragment,可以看 FragmentPagerAdapter 的實作




可以看到只有在找不到 fragment 時才會去呼叫 getItem 來 create 出一個 fragment 實體,這樣也解釋了為甚麼 google 範例中在複寫 getItem 時都直接 create 一個 fragment 出來了

不過這樣 getItem 的命名感覺很有問題阿,應該叫 createItem 才對,才不會造成混淆

也因為如此,螢幕轉向時,並沒有呼叫到 getItem,所以我取得的 fragment 都是 null,解決的方法很簡單,不需要自己儲存 fragment,也不需要額外實作 getFragment method,直接呼叫 FragmentPagerAdapter 的 instantiateItem 就可以取得當前顯示的 fragment
Fragment fragment = (Fragment)mPagerAdapter.instantiateItem(mViewPager, position);

2017年11月2日 星期四

windows 7 網芳 127.0.0.1 錯誤 0x800704cf

最近遇到一個問題是 PC 要 access 自己的網芳卻出現 error 0x800704cf,網路上找了很久卻沒甚麼有用的資料,後來發現有人說把一些奇怪的網卡驅動刪除後就恢復了,試了一下,magic,真的把網卡驅動刪除後就恢復了

恩...windows 真是博大精深