どのように多くのテーマスマートの皮のセット?プログラム詳細な分析をふじょうAPP!

背景需要

現在、Android APP皮は、大きく分けて2つのカテゴリに分けることができます。

  • 二つのスイッチングトピック(例えば昼/夜など)、スイッチング用のスイッチボタンを使用。
  • オンラインダウンロードとアップデートのテーマのいくつかのセット。

A第1の実質的に実装ローカル設定を使用してTheme動作するため、すべてのリソースにパッケージされAPP、テーマに応じて切り替えます。第二は、すべてのリソースがパッケージ化されているので、最初の実装を使用することは不可能であるAPP柔軟性の欠如で、更新活動を助長されていません、ともなりapk、パッケージのボリュームが増加しています。第二は、すべての実装は、オンラインダウンロードをサポートしなければならないということです。

プログラムを選択

再舗装のスマートな製品の需要がとができます、我々は、上記の2番目のオプションを選択しました。前回の後AndroidIOSパネルディスカッションのメンバー、ダウンロードと再生資源のパッケージに使用することができます統一アーカイブは圧縮を解析することによって置き換えられます。

どのようにダウンロードされたリソースの圧縮されたパッケージを読み込むには?2つの方法があります。

  • 解凍するスキンパッケージをダウンロードして、リソースファイルストリームファイルリソースを経由して画像内の読み。
  • ダウンロードしたスキンパッケージがにロードされassetManagerマネージャ、およびを通じて新しいマネージャーResourceによって制御を再舗装オブジェクトニーズResourceリソースオブジェクトを読み込みます。

手動でファイルストリームをオープンする最初の方法、および異なるファイル、異なるファイルが原因リソース負荷に流れなどの画像、テキストファイル、などのモード、ならびに異なるデバイスの解像度をストリーム持っているが、適切に権利をどのように選択するか、異なっています問題をロードするためのリソースが解決されるべきです。

皮膚は、パッケージの中にロードする必要がある第二の方法assetManager、管理assetManagerマネージャの新世代Resourceのオブジェクトとの私たちの主なプロジェクトResourceのオブジェクトは、同じクラスの異なるオブジェクトである、あなたが(例えば、負荷のリソースにはおなじみの方法を使用することができresource.getColorresource.getDrawableなど)。

ロードと2番目のオプションを選択するには、リソースを読んで上記の2つのリソースの負荷に基づいて。

詳細な説明

1は、所望の皮膚パッケージは、皮膚がパッケージである場合には、ローカルにネットワークを介してダウンロードapkできるようにするために、ファイルapkのみのリソースファイルを含むパッケージ十分に小さいが、。以上のような皮膚のパッケージ、よりがあるかもしれませんtheme1.skintheme2.skin...

2、addAssetPath AssetManagerオブジェクトメソッドの呼び出しによって、例えばtheme1.skinとして名前によってロードバック、ことと、新しいリソースオブジェクトは、次のコードを生成するためのパッケージを取得します。

  AssetManager assetManager = AssetManager.class.newInstance();
  //由于addAssetPath()这个方法被隐藏掉了,所以不能直接使用对象直接访问,
  //这里使用了反射的方式,作用是将该皮肤包加入到asset管理器中
  Method addAssetPath = assetManager.getClass().getMethod("addAssetPath"
  , String.class);
  addAssetPath.invoke(assetManager, skinPath);

  Resources skinResource = new Resources(
    assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());

3、カスタムInflaterFactoryサブクラス、SkinInflaterFactory書き換えonCreateView(View, String, Context, AttributeSet)方法、皮膚の制御属性分析および記憶のための必要性、及び皮膚を制御する第2の工程Resourceリソースをロードするために被験者を、これらのコントロールを設定することを。

4、で新しい方法オブジェクトとオブジェクトへの設定目的は、以下のコード:BaseActivityonCreateSkinInflaterFactorySkinInflateFactoryActivityLayoutInflater

  protected void onCreate(@Nullable Bundle savedInstanceState) {
      mSkinInflaterFactory = new SkinInflaterFactory();
      LayoutInflaterCompat.setFactory(
        getLayoutInflater(), mSkinInflaterFactory);
      super.onCreate(savedInstanceState);
  }

フローチャート

その他の問題

1、如何支持控件点击后触发不同的业务流程?
可以通过自定义一个属性,如skin:click="@string/clickAction",主工程的clickAction="muapp://app/testDefault",皮肤包里的clickAction="muapp://app/testClick",通过目前项目中的路由机制触发不同的跳转动作。比如说上述默认的跳转是跳转到主工程(appmodule名)的TestDefaultAction(注解actionName="testDefault")类的invoke方法中,而更改后会跳转到主工程(appmodule名)的TestClickAction(注解actionName="testClick")类的invoke方法中。
2、如何支持控件的不同行为方式?例如不同的动画效果等
这个问题和第一个问题的处理方式的类似的,同样可以通过主工程和皮肤包不同的tagString文案)处理不同的行为方式。
3、如何处理自定义View的换肤需求?
可以添加一个方法,将自定义View需要换肤的属性名(如background),属性值(如background对应的图片的资源ID)传递到方法中,然后去皮肤包的Resource对象中寻找是否有相应的可替换的皮肤或者可替换的行为。

总结

看完之后有没有掌握呢?作为一个程序员,要学的东西有很多,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

为了很好的生活,我们要多多学习,增加我们手里的金钱。尤其经历了这一疫情,我深深的感受到金钱的重要,所以,我们一定不能停下学习的脚步!

附上我的Android核心技术学习大纲,获取相关内容来GitHub:https://github.com/Meng997998/AndroidJX

发布了115 篇原创文章 · 获赞 53 · 访问量 1万+

おすすめ

転載: blog.csdn.net/Aerfa789/article/details/104383798