Yandexレクチャヌ高床なUI、パヌト1

2017幎床モバむル開発スクヌルの講矩をいく぀か公開したす。 この孊校はYandexのMobilizationプロゞェクトの䞀郚です。 ここでは、昚幎の「動員」に基づいお線集されたビデオコヌスを芋぀けるこずができたす 。



講矩「高床なUI」は、モバむルYandex.Mailチヌムの開発者であるDmitry Svirikhinによっお行われたした。 Dmitryは、Androidアプリケヌションむンタヌフェむスを開発する際に最も䞀般的な問題を解決する方法を説明したす。





トピックに関する䞊蚘のすべおを芁玄したしょう。 テヌマを䜿甚しお統䞀されたUI芁玠をスタむルする必芁がありたす。トピック党䜓を最初から蚘述する必芁はありたせん。システムテヌマから継承し、このテヌマの属性のサブセットを最初に蚭定できたす。


-今月、Mobilization Schoolで勉匷しおきたしたが、今月はUIを含む倚くのこずを孊びたした。 今日は、あなたがすでに孊べるこずをいく぀か明らかにし、たた䜕か新しいこずを䌝えようずしたす。 面癜いものになるこずを願っおいたす。



私の講矩は2぀のパヌトで構成され、その䞭でたず䜕らかの問題を提起し、次にそれを解決する方法を探したす。





今日調査する問題を芋おみたしょう。



最初に、アプリケヌションのUIの䞍䞀臎の問題ず、この䞍䞀臎を解決する方法を芋おいきたす。



第二に、Android開発のかなり倧きな問題の1぀は、キヌボヌドずの盞互䜜甚です。 キヌボヌドが画面に衚瀺されたずきの察凊方法、キヌボヌドずの䜵甚方法。



第䞉に、カスタムビュヌを効果的に適甚する方法を怜蚎したす。 講矩の1぀に既に合栌しおおり、カスタムビュヌを䜜成する方法、これにどのような芏則があるかを倧たかに想像しおください。 しかし、今日はこのトピックを少し開き、論理的に続けたす。 たた、可胜な堎合の状態の損倱に぀いおも少し調べたす。 もちろん、アクティビティを再䜜成するずきに状態を倱う可胜性がある堎合の動䜜方法も既に知っおいたす。 バンドルにいく぀かのものを保存し、それらを䜿甚しおアクティビティを再䜜成する必芁がありたす。



それでも、問題が発生する堎合がありたすが、今日はこれらすべおの問題を考慮に入れたす。



たた、UIのむンタラクティブ性の欠劂の問題を怜蚎し、UIをよりむンタラクティブにし、ナヌザヌが行ういく぀かのアクションに理解できるように応答する方法を確認したす。



最初から始めたしょう-矛盟に぀いお。



UIの䞍敎合にはいく぀かの皮類がありたす。 たず、AndroidのさたざたなデバむスでUIに䞀貫性がない堎合がありたす。 たずえば、異なるデバむスで同じビュヌが異なる堎合がありたす。 Androidにはかなり倚くのデバむスが搭茉されおいるこずはご存知のこずず思いたす。そのため、Androidのバヌゞョンごずに断片化がかなり進んでいたす。 したがっお、Android 4 UIでは䞀芋、Android 5では別の芋た目になりたす。 これにより、デバむス間でUIの䞍敎合が発生したす。



しかし、これはおそらく䞻な問題ではありたせん。アプリケヌションのUIに䞍敎合が生じる可胜性があるためです。異なる画面で異なる色のツヌルバヌを䜿甚したり、ツヌルバヌを䜿甚した色ず組み合わせるこずができない堎合がありたす。画面の巊にスクロヌルするナビゲヌションドロワヌで。 そしお、この問題を解決しなければ、少なくずもその解決策を倧幅に簡玠化する方法がありたす。



これらはテヌマずスタむルです。





それから始めたす。 そしお、最初にトピックが䜕であるかを刀断したしょう。



テヌマは、AndroidのUI党䜓の䞀皮のグロヌバル構成です。 テヌマの属性には、たずえば、UI党䜓の構築に関連する䜕らかの皮類のりィンドりログ、UIの構築にも䜿甚するグロヌバルな色ず画像、個々のビュヌずサブトピックのスタむル党䜓などが含たれたす。たずえば、ダむアログの堎合。



トピックには玄300個の属性があり、さらに倚くの属性がありたすが、トピックを定矩するずき、300個すべおの属性を再定矩する必芁はありたせん。単にこれを行うべきではありたせん。 これを行うために、プラットフォヌムは、䜕らかの既成のシステムテヌマから継承し、必芁なものを再定矩する必芁があるような方法を提䟛したす。



継承できるトピックを芋おみたしょう。



最初は、サポヌトラむブラリの䞀郚であるAppCompatラむブラリを接続し、このラむブラリで既に提䟛されおいるテヌマのいく぀かから独自のテヌマを継承するのが最適です。 したがっお、暗いUIを䜜成するにはTheme.AppCompatが必芁で、明るいUIを䜜成するにはTheme.AppCompat.Lightが必芁になる堎合がありたす。 そしお、これを実行した埌-これらの事前定矩されたトピックの1぀から独自のテヌマを継承したす-さたざたなデバむスでのUIの䞍敎合の問題はすでに解決されおいたす。 4番目、5番目、およびそれ以降のAndroid UIのナヌザヌは同䞀ではないかもしれたせんが、非垞によく䌌おおり、異なるデバむスでの䞍敎合の問題はすでに解決されおいたす。



そのため、䜕らかのシステムから継承した独自のテヌマを䜜成したした。 次に䜕をする必芁がありたすか





テヌマ属性の特性は、すべおの内郚テヌマずスタむルが䜕らかの圢で互いに結び぀いおいるこずです。最初に、属性のサブセット、いく぀かの基本的な属性を定矩する必芁がありたす。 スラむド䞊に衚瀺されたす。 それらのそれぞれに察凊したしょう。



たず、windowBackground、スラむド䞊で、指定された異なる背景でアプリケヌションの倖芳がどのように倉化するかを確認できたす。 windowBackgroundは、アプリケヌションのメむンの背景を蚭定するだけで、windowBackgroundパラメヌタヌに枡した色たたはドロりアブルを、すべおのビュヌが描画されるりィンドりの背景ずしお蚭定したす。



colorPrimaryやcolorPrimaryDarkなどのオプションもありたす。 それらの名前から、これらは非垞に重芁なパラメヌタヌであるず思われるかもしれたせんが、実際に必芁なのは、ツヌルバヌずステヌタスバヌにいく぀かの色を蚭定するこずだけです。 アクションモヌドに切り替えるず、同じツヌルバヌで䜿甚するこずもできたす。 これらの属性を䜿甚するず、ツヌルバヌずコンテンツの間の区切りが色付けされたす。



したがっお、さらに興味深い属性であるcolorAccentに進みたす。 名前が瀺すように、UIの重芁な郚分にナヌザヌを集䞭させるために必芁です。 䜕だろう たずえば、FloatingActionButton、ナヌザヌが珟圚線集しおいる線集テキスト、遞択したチェックボックスなどです。



colorControlNormalは、非アクティブ状態のUI芁玠の色を決定したす。 非アクティブな状態ずは、たずえば、フォヌカスのない線集テキスト、たたは遞択されおいないチェックボックスなどを意味したす。



反察に、colorControlActivatedは、フォヌカスされた線集テキストの色、遞択されたチェックボックスなどを決定したす。原則ずしお、colorAccentに関連付けられおいるため、この属性を再定矩する必芁はありたせん。必芁ではありたせんが、それでも、圌に぀いお知るこずは有甚です。



colorControlHighlightは、ビュヌをタップしたずきに匷調衚瀺する色を定矩したす。 実際、これはビュヌをタップしおしばらく埅぀ず衚瀺される波王の色ず同じです。



このような矎しい効果を埗るには、この色をアルファチャンネルに蚭定する必芁があるこずに泚意しおください。



ボタンなど、スタむリングに必芁な属性のリストもありたす-これはcolorButtonNormalです。 ボタン、それらはガむドでただ少し異なっおいるため、以前に怜蚎したcolorControlNormal属性の圱響を受けず、個別の属性を考え出したした。



たた、たずえば、スむッチにも同様の属性がありたす。 したがっお、colorControlNormalのような属性を蚭定するずきに、䜕かがペむントされおいなくおも問題ではありたせん。おそらく、問題を解決するのに圹立぀いく぀かの属性がありたす。



そしお、パラメヌタに぀いお、テキストに぀いお少し話をしたす。



システムには、textColorPrimaryアプリケヌションテキストのメむンカラヌやtextColorHighlightなどのパラメヌタヌがあり、テキスト遞択のカラヌを決定したす。 䞀般に、テキストに関連付けられおいるパラメヌタヌの数は非垞に倚く、特定のパラメヌタヌテキストの色属性がシステムの倚くのビュヌにどのように圱響するかをすぐに掚枬できるずは限らないため、2぀のオプションがありたす。 textColorPrimaryパラメヌタヌが機胜しなかった堎合は、必芁なテキストの属性を経隓的に決定するか、AppCompatラむブラリにアクセスしお、ビュヌが最終的にどの色に䟝存するかを確認できたす。



テヌマの色を蚭定し、同時にレむアりトのすべおのビュヌの背景が䞀般的にペむントされるこずが実際にどのように起こるかを考えおみたしょう。 実際、これは次のように起こりたす。ここには魔法はありたせん。



最初は、システムには通垞黒のビットマップが含たれおいるか、新しいAndroidではベクトルを䜿甚しお蚭定され、セレクタヌはこのビュヌの濃淡の圢でそれにバむンドされたす。 たずえば、チェックボックスの堎合、このようなセレクタヌはスラむドに衚瀺されるようにアタッチできたす。これは、Checked状態ではビュヌの背景をcolorControlActivated属性で指定された色で着色する必芁があるこずを瀺したす。 したがっお、ビュヌこの堎合はチェックボックスがChecked属性を受け入れる堎合、この色でペむントされたす。 これは、colorControlActivatedの䞋に黄色を蚭定した堎合のチェックボックスの倖芳です。





そしお、属性に぀いお泚意すべきもう1぀の重芁な点-レむアりトで盎接参照できたす。 階局内のレむアりトにトリプル効果を加えたいずきにスラむドに衚瀺される最も䞀般的な方法を次に瀺したす。 selectableItemBackgroundの背景を指定するだけで、このフレヌムレむアりトをタップするず、リップルが衚瀺されたす。 これはAndroid 5以降で䜿甚され、Android 4ではタップするだけで背景が倉曎されたす。



トピックに関する䞊蚘のすべおを芁玄したしょう。 テヌマを䜿甚しお統䞀されたUI芁玠をスタむルする必芁がありたす。テヌマ党䜓を最初から蚘述する必芁はありたせん。䞀郚のシステムテヌマから継承し、このテヌマの属性の特定のサブセットを最初に蚭定できたす。



次に、これで十分でない堎合は、目的の結果を達成するために、いく぀かの他の属性を個別に倉曎できたす。 たた、必芁に応じお、レむアりトで属性を盎接䜿甚できたす。



そこで、トピックの曞き方を芋぀けたした。 どこで䜿甚できるか芋おみたしょう。 androidtheme属性を䜿甚しお、アプリケヌションずアクティビティのテヌマをマニフェストで盎接蚭定できたす。 これらの各ケヌスをい぀䜿甚できたすか アプリケヌションでは、たずえばラむトテヌマを蚭定できたす。 珟圚では、すべおのアプリケヌションが明るいテヌマで衚瀺されるこずがよくありたす。 同時に、暗い色のギャラリヌを䜜るのは非垞にファッショナブルです。 したがっお、メむンテヌマを蚭定しおから、ギャラリヌを衚瀺するアクティビティで個別に蚭定し、たずえば暗いテヌマを䜜成できたす。



しかし、他の状況もありたす。



ここにいく぀かのレむアりトがあるので、デフォルトのテヌマで芋えたす。 䞀般的に、すべおが悪いわけではありたせんが、私たちはそれが奜きではありたせん。 私たちたたは私たちのデザむナヌは、少し異なるトピックを望んでいたす-圌はツヌルバヌをずおも暗くしたいです。 アプリケヌションの䞻芁郚分で明るいテヌマを䜿甚しおいるこずがわかりたした-これは暗いテキストの明るい背景ですが、ツヌルバヌは突然暗いテヌマず明るいテキストになりたした。



これを行うために、Androidはビュヌレベルでテヌマを蚭定する機胜を提䟛したした。 ビュヌレベルでトピックを蚭定するずどうなりたすか ビュヌで蚭定したこのトピックで指定された属性は、それぞれ、このビュヌが衚瀺されるアクティビティの䞻な属性をオヌバヌラむドしたす。



このために、システムはいわゆるThemeOverlayも提䟛したす。このテヌマから独自のテヌマを継承し、ビュヌに転送したす。たた、AppCompatラむブラリを䜿甚するず、䜿甚可胜なもののリストが既にありたす。継承できたす。 したがっお、ThemeOverlay.AppCompat.Lightは、階局の䞀郚を暗いテヌマから明るいテヌマに再定矩し、ThemeOverlay.AppCompat.Dark-逆に明るいテヌマから暗いテヌマに再定矩するように蚭蚈されおいたす。 ActionBarおよびDarkActionBar甚のオヌバヌレむもすでに甚意されおいたす。 前述の䟋では埌者を䜿甚する必芁がありたす。



では、この状況を芋おみたしょう。 ビュヌレベルで蚭定したテヌマずスタむルの違いは䜕ですか スタむルが䜕であるかを知っおおり、それらを耇数回䜿甚しおいるず思いたす。この階局のビュヌBにいく぀かのスタむルを定矩するずしたしょう。 その堎合はどうなりたすか このスタむル内にあるすべおの属性は、ビュヌBのみに䜜甚したす。



ビュヌBのテヌマを蚭定する堎合、どうなりたすか このトピックのすべおのグロヌバル属性は、Bだけでなく、そのすべおの子この堎合はDずEにも階局党䜓に圱響したす。 しかし、DずEに他の子がいた堎合、トピックもそれらに拡匵されたす。



ビュヌBのスタむルずテヌマの䞡方を蚭定するずどうなりたすか 䞀般的にすべおが非垞に明確です。 スタむルはこのビュヌBにも適甚され、テヌマはBずそのすべおの子に拡匵されたす。



次に、ビュヌレベルで蚭定できるスタむルずテヌマの違いを正匏に決定したす。 このスタむルは、このスタむルを定矩する特定のビュヌにのみ適切な属性のサブセットを指定するように蚭蚈されおいたす。 たずえば、スタむルにTextView、TextAppearance属性、たたはBackgroundを蚭定するず、スタむルに含たれるこずがありたす。 これはトピックの通垞の䟋です。 䞀般的に、テヌマはもずもず同じビュヌの重耇を排陀できるように意図されおいたした。 ビュヌにテヌマを蚭定する堎合、このテヌマを蚭定した階局党䜓の䞀郚のグロヌバル属性を再定矩するように蚭蚈する必芁がありたす。



トピックには、前述のcolorControlNormalなどの属性が含たれる堎合がありたす。



TextAppearanceず呌ばれる別のタむプのスタむルもありたす。これは、テキストのみに関連付けられおいる倚くの属性を定矩するように蚭蚈されおいたす。 色、サむズ、フォント、さらにはテキストの圱のようになりたす。 そしお、それらは䞻にEditTextやTextViewなどのビュヌに䜿甚されたすが、䞀般に、䜿甚されるビュヌの特定のセットがただありたす。 䞻な特城は、これらのスタむルを、TextAppearanceずいうフレヌズが存圚する名前の属性に転送する必芁があるこずです。 芚えやすい。



ここでは、プラットフォヌムのAppCompatラむブラリを䜿甚しお、このようなTextAppearanceを䜜成しおいたす。 それらを䜿甚できたす。 これらのスタむルを䜿甚しおモックアップを提䟛するようにデザむナヌに指瀺するこずもできたす。



䞀般に、Androidのタむポグラフィのトピックは非垞に広範囲です。 講矩党䜓をそれらに費やすこずができたすが、おそらく、私はそれを独立した研究のために残すでしょう。 䞋郚には、Androidのテキストに関するさたざたな詳现を読むこずができるリンクがあり、開発に盎接関連する次のトピックに進みたす。



そしお、スタむルに぀いお最埌に蚀いたかったのは、スタむルの明瀺的および暗黙的な継承です。 芋おみたしょう、いく぀かのレむアりトがありたす。 これは通垞のログむンフォヌムです。 したがっお、電子メヌルずパスワヌドの入力フィヌルドがありたす。 これらのフィヌルドは非垞に䌌おいるように芋えたすが、それでも、共通する郚分ずスタむルの違いがいく぀かありたす。 これらのスタむルの階局を構築しおみたしょう。





AuthFieldず呌ばれるスタむルを䜿甚しお䞀般的な郚分を匷調し、ログむンずパスワヌドに察しお個別に、銎染みのある方法で継承されるスタむルを䜜成したす。 トピックも継承したした。 これは芪属性を䜿甚しお行われ、䞀般に、すべおが明確でシンプルです。 しかし、それ以倖のこずはできたす。 より芖芚的にするこずができたす。より芖芚的な方法で、スタむルの階局をたどるこずができたす。





ポむントを介しお共通郚分を単玔に分離し、この方法で共通郚分から掟生したスタむルを蚘述するこずができたす。



独自の階局では、この方法はより芖芚的で明癜であるため、より受け入れられるように思われ、䞀般にこの方法を䜿甚したす。



スタむルずテヌマに぀いお、私は私が欲しかったすべおを蚀いたした。 QAセッションに぀いおは、ビデオを参照しおください。-Ed。



テキストフィヌルドに぀いお説明しおいるので、テキストフィヌルドを取埗する際の䞻な問題を把握したす。 この問題はキヌボヌドず呌ばれ、レむアりトの䞀郚ず重なる堎合がありたす。



たた、これはナヌザヌにずっお必ずしも良いずは限りたせん。そのため、「キヌボヌドずの察話」セクションで、キヌボヌドに関連する䞀郚のパヌツを芋おみたしょう。



したがっお、アプリケヌションを開発しおいるある時点でキヌボヌドのサむズを決定したい堎合は、99のケヌスでこれを行う必芁はなく、単に行う必芁はありたせん。 これは、たずえばチャットを開発しおいる堎合にのみ圹立ちたすが、他のすべおの堎合では必芁ありたせん。 レむアりトのサむズ倉曎を監芖し、これに応じお、キヌボヌドが衚瀺された埌のサむズに画面䞊のすべおを調敎する方がはるかに簡単です。



キヌボヌドは別のアプリケヌションであり、決しお蚭定できないこずを理解するこずも重芁です。それは、実際にはそれだけであるため、キヌボヌドは画面の3分の2を占めるこずができたす。



そしお、レむアりトのかなりの郚分をカバヌする堎合、䜕をする必芁がありたすか このレむアりトをScrollViewに配眮するだけで、キヌボヌドが画面党䜓の2/3をカバヌし、スクロヌルしおレむアりトの腞のどこかに必芁なボタンを芋぀けるず、ナヌザヌはそのような画像を芋るこずができたす。





では、レむアりトの倉曎にどのように察応できたすか この非自明な方法を䜿甚しお、OnLayoutChangeListener。 ビュヌが配眮されおいるScrollViewたたは別のスクロヌル可胜なコンテナヌにサブスクラむブする必芁がありたす。サむズの倉曎に応じお、倉曎された堎合は、利甚可胜な新しい高さに合わせお曎新するこずができたす。



䜕ができたすか たずえば、ロゎを削陀するず、すべおが衚瀺されたたたになりたす。たたは、ログむンボタンをツヌルバヌに移動するこずもできたす。これもオプションです。 䞀般に、むンデントを削陀でき、倚くのこずができたす。 すべおはあなたの想像力ずあなたのデザむナヌの想像力によっおのみ制限されたす。



キヌボヌドずの盞互䜜甚に関連する別のポむント。 ナヌザヌが䞍芁なアクションを匷制しない限り、ナヌザヌはそれを気に入っおいたす。 , e-mail (@) . - , , e-mail. いいね



. e-mail, , , . , «» . user «», , , . . , -, , Sign In, , Done, layout, . .



: inputType imeOptions. inputType , - . -. inputType Text Password, , , . , .



inputType - , , textEmailAddress, «» .



. , — , , , , .



imeOptions, , , . . , «», «», «», .



, inputType. textEmailAddress, «» — , e-mail.



inputType - . , - - .



inputType=”phone”, . , , — , , , . .





listener - , . Done. , . — .



Actiondone, , — .



, - . , Actionnext , . , , - , .



, . - , landscape, - . layout . fullscreen-, , - . , , , - , layout . . , , : « » ( e-mail), NoExtractUi imeOptions, Pipe, imeOptions , action . , .



, . layout, . .



-, UI- , , , , ScrollView. , , inputType imeOptions, XML, . , . ( . . — . .)



, , - , view.



, , - frame layout. view frame layout, .



- linear layout. view, .



- view. ?



view, , view , - , , - , view, . , . , . - , view.



-, view, , , . .



« custom view».



, view.



, — view - , . , , view , . , view. -, view - , - view . , , button . button - . .



䞉番目。 , view , Support Library, , - , , - .



view . - view, - : «, , - listener view, ». , , — view.



compound view. compound view? . Compound view compound components ( ). , view group .



? -, - layout, , , - -. . compound view, - linear layout, frame layout . . , performance . , - relative layout. , . , . view, view group, view .



, Android ́ view, , ConstraintLayout, CoordinatorLayout, FlexboxLayout ( , ). layout, , , - layout.



view. .



, , , Context , view .



, AttributeSet, , , view XML. LayoutInflater.



? , , , Button, , . , .



buttonStyle. これは䜕ですか , , , , view , .



? Android 5, . , , , .



-, , Button .



, , view . view - , - .





, , view. . , view , - . , , .





- obtainStyledAttributes, XML, XML. attrs, defStyleAttr defStyleRes — . styleable? XML, , declare-styleable , view . , obtainStyledAttributes .



TypedArray, , , , XML, - . TypedArray Recycle, TypedArray, view.





, , . , , , , 90% , . view, , , , . obtainStyledAttributes 0.



. - view, . , - , styleable.CustomView.



, . view , . , , , , - listener view. .



, view, , , , , .



, XML, view , .



view, view, layout, , .



, , , - , , . , , . , . , — . , . これに察凊する方法は , , Bundle OnSaveInstanceState , , , .



, , -, , , , , - . , , , Bundle.



.



, state. , activity, , , , — activity , — - , activity, activity state. , , activity OnSaveInstanceState. , , - state , , , state .



state? activity, fragment, , , . view, - . view, , state.



?



, - EditText, , , . ViewPager, , Spinner RecyclerView. view .



? , view.



, , view , . , , , — , view, , , — , . , Bundle , .



, drawable. drawable Bundle Parcelable, Parcelable, , Android 700 , . , drawable, , .



drawable Glide Picasso. , drawable .



? , view , , activity - , , , . , , . .



, , , -, .



, . view, , . . view . , . RecyclerView, ListView. , .





? , , , , . , - — , — , - , , .



, , ProgressBar.



, view , . , . , , , .



- .



, , , OnSaveInstanceState - . , , , Fragment Manager, , layout, , Back Stack, . . Activity, Fragment Manager, . , , - , , . , . , , . これはどうですか





, , onCreate, , , , activity , , , , , , - .



, ?





, , . . activity , - . , , , - . , , , .



, : Fragment Manager .



, , , , , DialogFragment. 他に䜕もありたせん。 , , , DialogFragment — , . .



. .



-, UI , .



-, layout, , layout, , , , .



第䞉に、賢明にカスタムビュヌを䜜成する必芁がありたす。その前に、あなたは考える必芁がありたす-私は同じ芋解を持っおいたすかたたは、新しいビュヌを䜿甚しお再利甚できるように、このビュヌのXMLを修正できたすか



状態に぀いおは-システムができるこずをする必芁はありたせん。リストの状態を埩元するために異なる束葉杖を曞く必芁はありたせん。必芁なのは、状態の回埩に関連する、おそらくあたり明癜ではないルヌルを䜿甚するこずだけです。



これで、最初の郚分を終了したいず思いたす。ご枅聎ありがずうございたした。



All Articles