2019年8月22日 星期四

androidx DialogFragment private constructor 報錯問題

https://stackoverflow.com/questions/51831053/could-not-find-fragment-constructor

我在我的DialogFragment裡面加了一個私有constructor, private constructor()
結果在vivo的手機上可以顯示,可是在跳轉到另外一個Activity的時候卻導致閃退
目前只有vivo的手機上測到這個問題,ASUS 三星 小米 模擬器都沒發生這個問題
結論:還是盡量避免寫私有建構子,沒有什麼特別優點只有爽爾以

報錯訊息:java.lang.RuntimeException: Unable to start activity ComponentInfo{/com.xxxxx.Activity.VideoStorageActivity.VideoStorageActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.xxxxx.b.g.f: could not find Fragment constructor
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2982)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1769)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
     Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.xxxxx.b.g.f: could not find Fragment constructor
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:8)
        at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:1)
        at androidx.fragment.app.FragmentManagerImpl$6.instantiate(FragmentManagerImpl.java:1)
        at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:4)
        at androidx.fragment.app.FragmentManagerImpl.restoreSaveState(FragmentManagerImpl.java:27)
        at androidx.fragment.app.FragmentController.restoreSaveState(FragmentController.java:2)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:3)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:4)
        at com.xxxxx.Activity.VideoStorageActivity.VideoStorageActivity.onCreate(VideoStorageActivity.kt:1)
        at android.app.Activity.performCreate(Activity.java:7125)
        at android.app.Activity.performCreate(Activity.java:7116)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2935)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1769) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:192) 
        at android.app.ActivityThread.main(ActivityThread.java:6839) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826) 
     Caused by: java.lang.NoSuchMethodException: <init> []
        at java.lang.Class.getConstructor0(Class.java:2320)
        at java.lang.Class.getConstructor(Class.java:1725)
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:4)
        at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:1) 
        at androidx.fragment.app.FragmentManagerImpl$6.instantiate(FragmentManagerImpl.java:1) 
        at androidx.fragment.app.FragmentState.instantiate(FragmentState.java:4) 
        at androidx.fragment.app.FragmentManagerImpl.restoreSaveState(FragmentManagerImpl.java:27) 
        at androidx.fragment.app.FragmentController.restoreSaveState(FragmentController.java:2) 
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:3) 
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:4) 
        at com.xxxxx.Activity.VideoStorageActivity.VideoStorageActivity.onCreate(VideoStorageActivity.kt:1) 
        at android.app.Activity.performCreate(Activity.java:7125) 
        at android.app.Activity.performCreate(Activity.java:7116) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2935) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1769) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:192) 
        at android.app.ActivityThread.main(ActivityThread.java:6839) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826) 

2019年8月13日 星期二

Android LiveData 導入問題

var model=ViewModelProviders.of(this).get(VideoViewModel::class.java)
model.downloadDataLiveData.observe(this, Observer {  })

this過不了他會要求lifecyclerOwner
去更新implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
或者是更新版的

2019年1月29日 星期二

Android Google Map 上架細節(上架後沒有顯示)

Android Google Map上架細節

0.Google Map的導入這個隨便google就有

1.除了你在values的google_maps_api.xml(debug)的key要出入
  還有google_maps_api.xml(release)的key也在輸入,通常切換到project就會找得到


2.如果同時有兩台電腦在測試的話,記得要把兩台的SHA-1碼都要去Google Map Api那邊登記,藍色的那個點兩下跑一下之後就會在下面看到你的SHA-1碼,如果沒有話在google找其他方法


3.如果要測試release的地圖能不能用,記得要把你的keystore檔案的SHA-1碼也去登記
  取得你的keystore的SHA-1碼,通常在api登入那邊有寫
  keytool -list -v -keystore mystore.keystore
  例如我的輸入:keytool -list -v -keystore C:\Users\SERS\Downloads\xxx.keystore
  用一般的CMD或是Android Studio的Terminal都可以

4.這一點最重要當你把你的APK上傳到的google play console之後,在"版本管理"的
  "應用程式簽署"往下拉會看到兩個,"應用程式簽署憑證"和"上傳憑證","應用程式簽署憑證"
  裡面的SHA-1碼也要去Google Map Api裡面登記,至於"上傳憑證"如果你有做第三點的話你會發
  發現那應該就是你的keystore的SHA-1碼


5.google map api的套件名稱輸入欄通常都是一樣,例如我的:com.shang.fcu_food