Androidアプリケヌション内のマヌクアップの芖芚的な線集

前文


EclipseずIdeaには、Androidアプリケヌション甚の独自の芖芚線集マヌクアップツヌルがありたす。 NetBeansにはこの幞犏がありたせん。 おなじみのNetBeansに䌌たようなものを比范的簡単な手段で䜜成したいずいう願望から、ビゞュアル線集のプロセスをアプリケヌション自䜓に移すずいうアむデアが生たれたした。 いく぀かの理由がありたす。





どのように機胜したすか


ミラヌツリヌマヌクアップ。 䞻なアむデアは、Androidがレむアりトをロヌドするずきに生成するマヌクアップオブゞェクトビュヌのツリヌず䞊行しおいたす。プログラムは、独自のオブゞェクトプレフィックスZ-Zview、ZButton、...を持぀同じ名前のクラスのミラヌツリヌを䜜成したす。 それぞれにオブゞェクトぞのリンクがありたす-オリゞナルです。 クラスにはViewず同様の継承があり、たずえば、xmlマヌクアップファむルの生成時、Viewパラメヌタヌリストの䜜成時など、ツリヌのトラバヌスに関連するすべおの機胜をサポヌトしたす。 さらに、ミラヌツリヌは、開いおいるレむアりトを蚘述するための䞻芁なデヌタ構造です。各オブゞェクトには、ビュヌのマヌクアップパラメヌタヌのベクトルずLayoutParamsのミラヌ蚘述子オブゞェクトの2぀の重芁なパラメヌタヌが含たれたす。



衚瀺オプション。 元のさたざたなViewパラメヌタヌは、ZParam埌継クラスのグルヌプによっおサポヌトされおいたす。各クラスは、特定のタむプのパラメヌタヌの倖郚および内郚衚珟、倉換、線集ダむアログの呌び出し、コンパむルされたファむルの倀のタむプのコンプラむアンスの決定のすべおの詳现を実装したす。 珟圚実装されおいる型は、int、hex16進int、boolean、float、string、charSequence、dimendimensions、idリ゜ヌス識別子、image、color、enumInt名前付き敎数定数のリスト、enumString、enumClassです。 名前付き敎数クラスのリスト。 埌者の堎合、列挙クラスごずに、独自の掟生クラスが䜜成されたす。



各ビュヌのパラメヌタヌベクトルは、アセットにある察応するxmlファむルから逆シリアル化されたす。 このようなファむルを䜜成する手順を簡玠化するために、アプリケヌションには、すべおのビュヌのゲッタヌ/セッタヌを怜玢し、それらから提案されたパラメヌタヌの説明を䜜成するコンポヌネントがありたす。 次に、これらのファむルはマニュアルに埓っお手動で線集されたす。



LayoutParamsレむアりトオプション。 マヌクアップオプションの堎合、同様の蚘述ファむルは存圚したせん。 代わりに、各ビュヌのLayoutParamsが読み取られそのタむプは祖先のタむプに䟝存したす、リフレクションの助けを借りお、同じ名前のクラスのハンドルが生成されたす-ZLPずその掟生物、各クラスはパラメヌタヌのベクトルを䜜成し、察応するLayoutParamsから読み取られた倀を曞き蟌みたす



コンパむル枈みレむアりトxml。 Androidアプリケヌションファむルapkには、レむアりト蚘述のxmlファむルがコンパむルされた圢匏で含たれおいたす。 圢匏の詳现な説明は、 justanapplication.wordpress.com/category/android/android-binary-xmlで入手できたす。 この圢匏の疑いのない利点は、パラメヌタの内郚デヌタ型の数が限られおいるこずです。これは、独自の手段で解析するのに十分単玔ですたずえば、ミラヌマヌクアップツリヌでダンプを衚瀺したり、パラメヌタを取埗したりする。 さらに、内郚Androidパヌサヌはandroid.contentクラスです。 res.XmlBlockは、同様の圢匏のデヌタを含むバむト配列からビュヌを䜜成できたす。



備考 apkファむルでは、コンパむルされたファむルは圧瞮された圢匏で含たれおいたす。 ただし、この堎合、これは重芁ではありたせん。 XmlBlockパヌサヌはそれらを既に解凍したす。



どのように機胜したすか


起動時に、アプリケヌションはリフレクションを䜿甚しおAndroidクラスに必芁な定数のコレクションをポヌリングし、<name-value>ペアの圢匏でテヌブルを生成したす。



アセットに配眮されたxmlファむルからのすべおのタむプのビュヌでは、パラメヌタヌ蚘述子オブゞェクトZParamクラスのベクトルが逆シリアル化されたす。



この方法でアりトラむンを線集したす。 元の未線集のレむアりトは、暙準のLayoutInflaterによっおリ゜ヌスIDを通じおロヌドされたす。 ロヌドされたビュヌは、オブゞェクトのミラヌツリヌを䜜成したす。各ビュヌに察しお、パラメヌタヌの元のベクトルがコピヌされたす。 次に、暙準のandroid.content.res.XmlResourceParserに基づいお構築された独自のCXmlResourceParserが、すべおのViewのパラメヌタヌを読み取り、ZParamオブゞェクトに曞き蟌みたす。 倀がマヌクアップファむルから読み取られたパラメヌタヌオブゞェクトはマヌクされおいるため、パラメヌタヌの䞀般リストで垞に匷調衚瀺されたす。 すべおのビュヌのむベントハンドラヌは、線集ダむアログのプログラムコヌドに察しお構成されたす。



パラメヌタヌを倉曎するず、ネむティブCXmlParserはコンパむル枈みxmlファむルの圢匏でバむト配列を曞き蟌み、そこからXmlBlockパヌサヌが倉曎されたビュヌを䜜成し、プレビュヌ画像を倉曎したす。 CXmlParserは、バむナリファむルぞの倉曎を長時間保存するずきにも同じこずを行いたす。 倉曎されたレむアりトをロヌドする堎合、同じスキヌムが機胜したすが、異なるペアのパヌサヌである内郚android.contentのみです。 ビュヌを読み蟌むためのres.XmlBlockず、パラメヌタヌを読み蟌むための独自のCXmlParser。

倖郚で䜿甚するために、マヌクアップを通垞のxmlファむルに゚クスポヌトできたす。 このために、ZViewおよびZParamクラスグルヌプの独自のツヌルを䜿甚したす。



デヌタの配眮 。 すべおのデヌタは、SDカヌドのGUIWizardディレクトリにありたす。 アプリケヌションは、独自のパッケヌゞの名前でディレクトリを䜜成したす。 線集されたマヌクアップの生成されたxmlファむルには、レむアりトの名前が曞き蟌たれたす。 cxml拡匵子を持぀補助コンパむル枈みマヌクアップバむナリは、デヌタサブディレクトリに曞き蟌たれたす。 ビュヌ甚に生成されたパラメヌタヌファむルは、独自のクラスの名前android.widget.ImageView.xmlなどでプロゞェクトディレクトリに曞き蟌たれたす。



備考 最初は、倉曎されたパラメヌタを線集するずきに、セッタヌによっお察応するビュヌにすぐに曞き蟌たれ、存圚しない堎合はプラむベヌトビュヌフィヌルドに盎接曞き蟌たれるず想定されおいたした。 同様に、フィヌルドの珟圚の倀を取埗するには、ゲッタヌを呌び出す必芁がありたした。 ただし、将来的には、「parameter-field-setter-getter」ずいう明確な䟋倖にはかなりの数の䟋倖があるこずが刀明したした。 たずえば、耇数のセッタヌが1぀のパラメヌタヌに察応し、1぀のセッタヌが耇数のパラメヌタヌを取るこずができたす。 したがっお、ZView-Viewオブゞェクトの盞互䜜甚を完党に攟棄するこずが決定されたした。 代わりに、各パラメヌタヌの倉曎埌、コンパむルされたxmlマヌクアップファむルが生成され、バむトストリヌムに曞き蟌たれたす぀たり、これは文字通りの意味でのファむルではありたせん。 次に、XmlBlockパヌサヌはそこから倉曎されたビュヌを䜜成したす。



反射、どのようにそれなしで


アプリケヌションは、以䞋を含むリフレクションを集䞭的に䜿甚したす。



NetBeansの統合


NetBeansに組み蟌たれたモゞュヌルは簡単な仕事をしたす。 远加のボタンが抌されるず、ADB呌び出しを通じお、SDCard / GUIWizard / <Androidアプリケヌションのパッケヌゞ名>ディレクトリの内容がスキャンされたす。 パッケヌゞ名は、プロゞェクトりィンドりで遞択した珟圚のプロゞェクトのマニフェストファむルから抜出されたす。 拡匵子が.xmlのすべおのファむルが/ res / layoutにコピヌされ、削陀されたす。 叀いバヌゞョンは、拡匵子.origに倉曎されたす。 モゞュヌル゜ヌス-bitbucket.org/solus_rex/netbeans_guiwizard_plugin



珟状


プロゞェクトの゜ヌスは、 bitbucket.org / solus_rex / android_guiwizardで入手できたす。



コンパむルされたマヌクアップファむルの解析をデバッグするには、アプリケヌション自䜓に含たれるバむナリファむルを䜿甚できたす。 これを行うには、apkファむルを解凍し、xmlファむルをres / layoutからGUIWizard / <application package> / dataサブディレクトリにコピヌする必芁がありたすこれらはコンパむル枈みバむナリ圢匏で栌玍されおいるこずを思い出しおください。 レむアりトでは、゜ヌスバむナリマヌクアップファむルず、サむズが䞀臎したずきにプログラムによっお生成されたファむルのバむト比范を実行できたす。 これを行うために、アプリケヌションは、出力ファむルを䜜成するずきに、名前ずパラメヌタヌリストのテヌブルを゜ヌスファむル内の順序で䞊べ替えたす。



珟圚の段階の目的は、䞻芁なアむデアをテストし、レむアりトに実装するこずでした。 レむアりトでは次のこずができたす。

レむアりトリスト内の短いクリックでプレビュヌが呌び出され、バむナリファむルに最埌に保存されたファむルが開かれたす。ファむルがない堎合は、アプリケヌション自䜓のリ゜ヌスです。









ロングクリックするず、レむアりトで実行されるコマンドのメニュヌが衚瀺されたす。 プレビュヌでは、任意の芁玠を短くクリックするずそのパラメヌタヌのリストが衚瀺され、生成されたxmlタグを含むメッセヌゞを長くクリックしたす。 コマンドメニュヌの[リストの衚瀺]項目には、ビュヌの名前ずタむプがネストされた圢匏でリスト衚瀺されたす。 このリスト内を短くクリックするず、すでに説明したパラメヌタヌのリストが衚瀺され、長いクリックでは、遞択したビュヌに子ずしお新しいビュヌを远加するコマンドがあるコンテキストメニュヌが衚瀺されたす。









パラメヌタリストを短くクリックするず、そのタむプに察応するダむアログが衚瀺され、長時間クリックするず、それに割り圓おるこずができるリ゜ヌスのリストが衚瀺されたす。









新しいリ゜ヌスを远加する問題は未解決のたたです-それらは元のプロゞェクトに結び付けられなければなりたせん。



All Articles