Androidがシステムのフォントサイズとフォントスタイルを切り替えると、Appがクラッシュしたり、インタフェースが乱れたりします.
2715 ワード
質問:最近会社で同級生をテストして、何気なくシステムのフォントサイズを調整した後、appをバックグラウンドからフロントに切り替えて、app crashを発見しました.
いくつかの資料を調べたところ、appに文字が表示されている単位はspであることが分かった.システムのフォントサイズが変化するとspのメトリック基準が変化し、appに構成が変化したことを通知し、インタフェースを再リフレッシュする必要があることを通知します.同様の操作は縦画面切り替えのようなもので,onConfigurationChanged()メソッドで必要な操作の構成を行う.
縦横画面切り替え時に歩くライフサイクルの方法はonDestroy()、onCreate()です.一般的に、私たちのアプリケーションの通常の構成は、横長スクリーンの切り替えを避けるために一定の方向を設定することです.次にconfigChangesプロパティを構成し、インタフェースの破棄と再構築を防止します.
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden
問題自体に戻り、問題が発生する原理は、システムのフォントサイズが変化し、appがフロントに戻ったときにappに通知を送信することです.appがこのとき歩くライフサイクルの方法は
onDestroy()
onCreate()
onResume()
このような操作によってUIインタフェースの更新が行われます.**ポイント:**この時点でappは異常走としてのonDestroy()メソッドであり、通常の戻りキーによる終了実行のonDestroy()ではない.このとき,onSaveInstanceState()メソッドに一時的に保存する前のインタフェース状態や変数情報が自動的に格納される.onCreate()の場合、bundleから直接取り出して使用するのに便利です.しかし、異常な状態なので、一部のエンティティの情報やfragmentスタックの状態が回復すると、エラーが発生したり、crashが発生したりする可能性があります.
解決方法:
android:configChanges="orientation|screenSize|keyboardHidden|**fontScale**
1.fontScaleプロパティを追加し、システムフォントが変化しないように、インタフェースを再作成します.このように処理するだけでappのバックグラウンドからフロントに切り替えると,システムのフォントサイズに応じてフォントが変化する.
2.appのフォントの単位をspからdpに変更すると、appのフォント表示はシステムのフォントの変化に伴って変化しません.
製品の必要に応じて自分で配置することができます.
上の問題を解決して、思考の上手な学生が聞いて、これはシステムのフォントの大きさを切り替える問題を解決して、もし私がシステムのフォントのスタイルを切り替えるならば?問題が発生したらどう解決すればいいですか?
実は上の基礎があって、この問題を解決するのはずっと簡単です.
フォントサイズを切り替えると、システムが通知を送信することを知っています.fontScaleプロパティを設定すればいいです.しかし、フォントのスタイルを切り替えると、システムは通知されず、グーグル公式にも通知されず、stackにも様々な質問があり、傍受のイベントや方法が見つからなかった.
スタイルを切り替えた後、Activityのライフサイクルを観察することができます.依然としてonDestroy()、onCreate()です.異常なdestroyなので、現在の状態情報をsaveInstanceState()メソッド内のbundle、onCreate()に格納する際、bundleから取り出して復元します.保存されたbundleステータスが間違っていて、インタフェースのロードが乱れている場合があります.
解決方法:
onCreate()の場合、bundleにデータがあるかどうかを判断し、データがあれば賦空処理を行い、正常な流れをたどればいいのです.具体的なコードは以下の通りです.
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
**if(null!= savedInstanceState)
savedInstanceState =null;**
super.onCreate(savedInstanceState);}
思考:実はこの时、フォントの大きさを切り替える时、このように配置することもできて、甚だしきに至ってはこのように配置した后にfontScaleなどの属性を気にしないで、インタフェースを自分でリフレッシュさせましょう、どうせ2回目のonCreate()は再びappに入る効果と同じです.
まとめ:ブロガーは最近ブログを書き始め、仕事で出会った穴を記録し、開発をしている仲間たちがこれらの穴を素早く迂回し、効率を高めることができるようにしました.もし文章に間違いがあったら、指摘してください.ありがとうございます.
当時調べた資料のウェブサイトも他のブロガーの無私な共有に感謝しています.
http://blog.csdn.net/murphykwu/article/details/24774015">http://blog.csdn.net/murphykwu/article/details/24774015
http://blog.csdn.net/zhuqiang1002/article/details/38756127">http://blog.csdn.net/zhuqiang1002/article/details/38756127
いくつかの資料を調べたところ、appに文字が表示されている単位はspであることが分かった.システムのフォントサイズが変化するとspのメトリック基準が変化し、appに構成が変化したことを通知し、インタフェースを再リフレッシュする必要があることを通知します.同様の操作は縦画面切り替えのようなもので,onConfigurationChanged()メソッドで必要な操作の構成を行う.
縦横画面切り替え時に歩くライフサイクルの方法はonDestroy()、onCreate()です.一般的に、私たちのアプリケーションの通常の構成は、横長スクリーンの切り替えを避けるために一定の方向を設定することです.次にconfigChangesプロパティを構成し、インタフェースの破棄と再構築を防止します.
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden
問題自体に戻り、問題が発生する原理は、システムのフォントサイズが変化し、appがフロントに戻ったときにappに通知を送信することです.appがこのとき歩くライフサイクルの方法は
onDestroy()
onCreate()
onResume()
このような操作によってUIインタフェースの更新が行われます.**ポイント:**この時点でappは異常走としてのonDestroy()メソッドであり、通常の戻りキーによる終了実行のonDestroy()ではない.このとき,onSaveInstanceState()メソッドに一時的に保存する前のインタフェース状態や変数情報が自動的に格納される.onCreate()の場合、bundleから直接取り出して使用するのに便利です.しかし、異常な状態なので、一部のエンティティの情報やfragmentスタックの状態が回復すると、エラーが発生したり、crashが発生したりする可能性があります.
解決方法:
android:configChanges="orientation|screenSize|keyboardHidden|**fontScale**
1.fontScaleプロパティを追加し、システムフォントが変化しないように、インタフェースを再作成します.このように処理するだけでappのバックグラウンドからフロントに切り替えると,システムのフォントサイズに応じてフォントが変化する.
2.appのフォントの単位をspからdpに変更すると、appのフォント表示はシステムのフォントの変化に伴って変化しません.
製品の必要に応じて自分で配置することができます.
上の問題を解決して、思考の上手な学生が聞いて、これはシステムのフォントの大きさを切り替える問題を解決して、もし私がシステムのフォントのスタイルを切り替えるならば?問題が発生したらどう解決すればいいですか?
実は上の基礎があって、この問題を解決するのはずっと簡単です.
フォントサイズを切り替えると、システムが通知を送信することを知っています.fontScaleプロパティを設定すればいいです.しかし、フォントのスタイルを切り替えると、システムは通知されず、グーグル公式にも通知されず、stackにも様々な質問があり、傍受のイベントや方法が見つからなかった.
スタイルを切り替えた後、Activityのライフサイクルを観察することができます.依然としてonDestroy()、onCreate()です.異常なdestroyなので、現在の状態情報をsaveInstanceState()メソッド内のbundle、onCreate()に格納する際、bundleから取り出して復元します.保存されたbundleステータスが間違っていて、インタフェースのロードが乱れている場合があります.
解決方法:
onCreate()の場合、bundleにデータがあるかどうかを判断し、データがあれば賦空処理を行い、正常な流れをたどればいいのです.具体的なコードは以下の通りです.
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
**if(null!= savedInstanceState)
savedInstanceState =null;**
super.onCreate(savedInstanceState);}
BaseActivity , 。
思考:実はこの时、フォントの大きさを切り替える时、このように配置することもできて、甚だしきに至ってはこのように配置した后にfontScaleなどの属性を気にしないで、インタフェースを自分でリフレッシュさせましょう、どうせ2回目のonCreate()は再びappに入る効果と同じです.
まとめ:ブロガーは最近ブログを書き始め、仕事で出会った穴を記録し、開発をしている仲間たちがこれらの穴を素早く迂回し、効率を高めることができるようにしました.もし文章に間違いがあったら、指摘してください.ありがとうございます.
当時調べた資料のウェブサイトも他のブロガーの無私な共有に感謝しています.
http://blog.csdn.net/murphykwu/article/details/24774015">http://blog.csdn.net/murphykwu/article/details/24774015
http://blog.csdn.net/zhuqiang1002/article/details/38756127">http://blog.csdn.net/zhuqiang1002/article/details/38756127