Android-View Control-軽量級Fragment

5424 ワード

最近、iOSとAndroidの開発モデルとアーキテクチャを統一する仕事をしています.インタフェースの部分はMVVMモードとUIコードをブロックして、巨大なビジネスファイルをできるだけ避けるつもりです.
UIコードブロックとは、UIコードをできるだけ分割し、インタフェースの一部を一つのモジュールに変え、各モジュールには完全なビジネスコードがあり、最後にこれらの小さなモジュールを組み合わせたいということです.
iOSでは、ViewControllerはViewControllerの相互ネストをサポートしているので実現しやすいが、Androidでは皆さんがよく知っているものがある.それがFragmentだ.Fragmentの最初の誕生は,インタフェースロジックの複雑さをできるだけ低減し,コード再利用を最大限に実現することを望んでいる.しかし、数年が過ぎて、みんなはFragmentに満足していないで、複雑な論理、各種の予見できないBUG、Fragmentのネストは更に恐ろしくて、一連の問題はそれを本当に流行させませんでした.
そこで私は簡略化されたFragmentを実現することにしました.その名前はViewControllerと呼ばれ、主に以下のいくつかの目標を満たしています.
  • 各UIモジュールは、完全なページ
  • として機能することができる.
  • 各UIモジュールは、
  • を別のモジュールの子供としてネストすることができる.
  • Activityコンセプトを弱体化し、UIモジュールを1ページのルートノード
  • とする
    前の2つの目標はよく理解していますが、3つ目はどういう意味ですか.
    一部のコードがActivityに書かれていて、もう一部がViewControllerに書かれていて、ViewControllerにActivityを埋め込ませて割れるような感じがするので、私の想定ではActivityの代わりにViewControllerを使いたいと思います.つまり、1つのViewControllerは完全なページとしてネストして使用することができます.Activityが存在する意味は、最上位レベルのViewControlを初期化することにすぎない.
    大きな白話で言えば、Activityにはほとんどコードを書かず、Frgageにコードを書き、Activityは巨大なFragmentです.
    一見、これは確かに奇妙なコード組織方式ですが、iOSとAndroidの開発モデルとアーキテクチャを統一するために最初に言及した初心を忘れないでください.iOSとAndroidの両方で同じコンピテンシーレベルのView Controlを保証した後、View Controlにネストされたツリー構造でUIモジュール全体を管理することができます.各モジュールには独自のView Modelが搭載されており、MVVMモデルに合わせて、ビジネスロジックを明確かつ簡単に設計することができます.この点はReactのComponentに似ています.
    ViewControllerの作成
    ViewControllerは基本的にFragmentと一致する文法とライフサイクルを維持しているので、あまり難しくはありません.ViewControllerを作成するコードは次のとおりです.
    package io.hytron.demo.viewController;
    
    import io.hytron.base.ViewController;
    
    public class MainViewController extends ViewController {
        private TextView tvName;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.vc_main, container, false);
            tvName = (TextView) view.findViewById(R.id.tvName);
            return view;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    }
    
    ViewControllerのコードは、継承された親が異なる以外はほとんどFragmentと一致していることがわかります.次に、Activityで初期化する方法を見てみましょう.
    package io.hytron.demo.activity;
    
    import android.os.Bundle;
    
    import io.hytron.demo.viewController.MainViewController;
    import io.hytron.base.ViewControllerActivity;
    
    public class MainActivity extends ViewControllerActivity {
        MainViewController mainViewController;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mainViewController = new MainViewController();
            getViewControllerManager().add(mainViewController, null, true);
            setContentView(mainViewController.getView());
        }
    }
    
    ここでMainActivityがViewControllerActivityに継承されているのを見ることができますが、Fragmentを知っている友人が一致して似ていると感じている場合は、Fragmentを使用する場合も、ActivityをFragmentActivityに継承しなければならないからです.
    onCreateメソッドでは、MainViewControllerを初期化し、mainViewControllerを呼び出す.getView()は、MainViewControlのViewをActivityの「画面」に設定し、Activityを「弱める」目的を達成しました.
    実際には、Annotationによってコードをさらに減らすことができます.例えば、次のような方法があります.
    @ViewController("MainViewController")
    public class MainActivity extends ViewControllerActivity {
    
    }
    
    しかし、初期のフレームワークの不安定性を考慮すると、より多くのコードを露出してデバッグを容易にし、将来のすべてのニーズが完璧に配慮されてから、この部分をさらに最適化したいと考えています.
    ネストされたViewControl
    Activityの代わりにViewControllerを使用した後、ViewControllerのネストを実装する方法を見てみましょう.コードは次のとおりです.
    package io.hytron.demo.viewController;
    
    import io.hytron.base.ViewController;
    
    public class MainViewController extends ViewController {
        private TopViewController vcTop;
        private TextView tvName;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.vc_main, container, false);
            vcTop = new TopViewController();
            getViewControllerManager().add(R.id.vcTopContainer, vcTop);
            tvName = (TextView) view.findViewById(R.id.tvName);
            return view;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            vcTop = null;
        }
    }
    
    onCreateViewでは
    vcTop = new TopViewController();
    getViewControllerManager().add(R.id.vcTopContainer, vcTop);
    
    を使用して、ViewControllerのネストを実現します.この一言はどういう意味ですか.まずvcTopを初期化し、add法でvcTopをvcTopContainerという容器に追加しました.layout部分は以下のように構成されています.vcTopContainerはFrameLayoutです.
    
    
    
        
    
        
    
    
    ViewControllerの本質
    ViewControllerの本質は何ですか?カスタマイズされたコントロールとして最も簡単に理解できますが、ViewControllerのネストは「サブViewController」で、自分のViewを「親ViewController」に渡し、父親が提供したコンテナに入れます.そしてもう一つのViewControllerManagerというマネージャーは、父親のライフサイクルの変化をリアルタイムで子供に伝えているだけです.
    FragmentがActivityに埋め込まれていることや、Fragmentのネストもこのような道数にすぎず、神秘的なところはありません.
    詳細コードは、https://github.com/dannnney/Android-ViewController