рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╡рд┐рд╖рдпред рд▓рд╛рдареА рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде

рдПрдХ рдмрд╛рд░, рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ, рдХрд╛рд░реНрдп рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдереАрдо рдмрдирд╛рдирд╛ рдерд╛ред рдореИрдВ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

  1. рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ - рдХреБрдЫ рд░рдВрдЧ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрджрд▓реЗрдВ
  2. рдкрд░рд┐рд╡рд░реНрддрди "рдЙрдбрд╝рд╛рди рдкрд░" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ (рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА, рд╕реВрдЪреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐, рдЖрджрд┐) рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рд╖рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдмрджрд▓ рд╕рдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд┐рди рдХреЗ рд╕рдордп рддрдХ
  4. рдореИрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдпрд╛ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, рдореИрдВ рдмрд╕ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
  5. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред


рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред



рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд░ рд░рд╣реЗ рд╣реИрдВ, Context.setTheme рд╣реИред рдПрдХ рдХреИрдЪ - рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рд╕рднреА рд╡реНрдпреВ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдереАрдо рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдлрд╝реНрд▓рд╛рдИ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреВрд░реНрдг рдирд┐рд░реНрдорд╛рдг рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдЧрд╛ред рд╣рд╛рдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдорд┐рд▓реА (рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рддреЛ рдореИрдВ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛)ред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред рд▓рд╛рдареА рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред

рд╣рдо рдмрд┐рдВрджреБ 4 рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдореИрдВ рдЦреБрдж рдХреЛ рдРрд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рдмрд╕ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рд╣реИред рдореИрдВ рдЦреБрдж рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рдореИрдВ рдмрд╛рддрдЪреАрдд рдХреЗ рддрд░реНрдХ рдкрд░ рд╕реЛрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬрдм рдЕрдЧрд▓реА рдЦрд┐рдбрд╝рдХреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдбрд┐рдЬрд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ред рдореИрдВ рдмрд╕ рддрддреНрд╡ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд░рдВрдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рдЯреИрдЧ рдкреНрд░реЙрдкрд░реНрдЯреА рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧреАред рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреИрдЧ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╕реВрдЪреА рджреГрд╢реНрдп рдореЗрдВ рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдареАрдХ рд╣реИред рдХреЛрдб рдореЗрдВ, рдЖрдк id рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реЗрдЯрдЯреИрдЧ / рдЧреЗрдЯрдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕реА рдХрдИ рдЬрдЧрд╣реЗрдВ рд╣реИрдВ, рддреЛ рдЦреЛрдЬ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВрдЧреЗред

рдЕрдм рд╣рдо рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рдкреНрд░рд╛рд░реВрдк рд▓реЗрдХрд░ рдЖрдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдирд╛рдЬ рдХреЛ рдЪрдл рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯреИрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ: рд╣рдорд╛рд░рд╛ рдЯреИрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ "!" рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдирд╛рдо рдЖрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдкреГрд╖реНрдарднреВрдорд┐"ред рдлрд┐рд░ рдХреБрдЫ рд╡рд┐рднрд╛рдЬрдХ, рдЬреИрд╕реЗ рдХреБрдЫ "|", рдФрд░ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдкреНрд░рдХрд╛рд░ - рдкрд╛рда рд░рдВрдЧ, рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рдпрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ, рдЖрджрд┐ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреИрдЯ рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐: "! рдЪреИрдЯ | tiled_bg"ред рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд░реВрдк рд╕реЗ рдкреНрд░рд╕рдиреНрди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЬрд▓реНрджреА рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреИрдЧ рд▓рд┐рдЦрддреЗ рд╕рдордп рдХрдо рд╕реЗ рдХрдо рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд░рдЦрдирд╛ рдФрд░ рдЙрдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдВрд╕рд╛рдзрди! рдкреНрд░рд╛рдердорд┐рдХ! Text_fg рдХрд╛ рдЙрдкрдпреЛрдЧ 77 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдкреАрдЫреЗ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрди рдЯреИрдЧреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ ... рдРрд╕реЗ рдЯреИрдЧ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ "рдлреБрд▓рд╛рдПрдВ" рджреГрд╢реНрдп рдХреЗ рджреМрд░рд╛рди рддреБрд░рдВрдд рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╣рд░ рдмрд╛рд░ рдереАрдо рдмрджрд▓ рджреА рдЬрд╛рддреА рд╣реИред "рдЗрдиреНрдлреНрд▓реЗрдЯрд┐рдВрдЧ" рд▓рдЧрднрдЧ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ - рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ setContentView рдФрд░ LayoutInflater рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЪрд▓рд┐рдП setContentView рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрд╣реБрдд рдХрдо рдЖрдзрд╛рд░ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВред рдмрд╕ рд╕реЗрдЯрдСрдиреЗрдВрдЯ рд╡реНрдпреВ рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
public void setContentView(int id) { super.setContentView(id); HotTheme.manage(mActivity.getWindow().getDecorView()); } 

GetDecorView рдкрджреНрдзрддрд┐ рд╣рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ "рд░реВрдЯ" рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред
рд▓реЗрдЖрдЙрдЯрдЗрдиреНрдлрд╝реНрд▓реИрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпреВ рдмрдирд╛рддреЗ рд╕рдордп рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ, рдЗрд╕реЗ рд▓рдкреЗрдЯреЗрдВ:
 public class HotLayoutInflater { private LayoutInflater inflater; private HotLayoutInflater(LayoutInflater inflater) { this.inflater = inflater; } public View inflate(int resource, ViewGroup root, boolean attachToRoot) { View v = inflater.inflate(resource, root, attachToRoot); HotTheme.manage(v); return v; } public View inflate(int resource, ViewGroup root) { View v = inflater.inflate(resource, root); HotTheme.manage(v); return v; } public static HotLayoutInflater wrap(LayoutInflater layoutInflater) { return new HotLayoutInflater(layoutInflater); } public static HotLayoutInflater from(Context context) { return new HotLayoutInflater(LayoutInflater.from(context)); } } 

рдЕрдм - рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджреЗрдЦреЗрдВ:

HotTheme.java:
  public static void manage(View... views) { for (View v : views) { simpleManage(v); if (v instanceof ViewGroup) { ViewGroup vg = (ViewGroup) v; for (int i = 0; i < vg.getChildCount(); i++) { manage(vg.getChildAt(i)); } } } } public static void simpleManage(View view) { Object t = view.getTag(); if (t instanceof String) { String tag = (String) t; if (tag.startsWith("!")) { tag = tag.substring(1); String[] elements = tag.split("\\|"); String base = elements[0]; for (int i = elements.length - 1; i >= 1; i--) { ThemedView tv = createThemedView(view, base, elements[i]); tv.notifyChange(); HotTheme.sViews.add(tv); } } } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреГрд╢реНрдп рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЯреИрдЧ рд╣реИ рд╡рд╣ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдмрд╕, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рд╡рд┐рднрд╛рдЬрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ "-" - рдлрд┐рд░ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рддрддреНрд╡ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереАрдореНрдб рд╡реНрдпреВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рднреА рдЬрд╛рджреВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди рдЪреЗрдВрдЬ рдкрджреНрдзрддрд┐ рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╖рдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧреАред рдареАрдХ рд╣реИ, рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдереАрдореНрдб рд╡реНрдпреВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ - рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдереАрдореНрдб рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╡реНрдпреВ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рд░рд┐рд╕рд╛рд╡ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ:
 private static abstract class ThemedView { private WeakReference<View> view; ThemedView(View v) { view = new WeakReference<View>(v); } boolean notifyChange() { View v = view.get(); if (v == null) { return false; } onChange(v); return true; } abstract void onChange(View v); @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ThemedView view1 = (ThemedView) o; View v1 = view.get(); View v2 = view1.view.get(); return (v1 != null ? v1.equals(v2) : v2 == null); } @Override public int hashCode() { if (view == null) { return 0; } View v = view.get(); return v != null ? v.hashCode() : 0; } } 

рдЕрдм, рдЬрдм рд╡рд┐рд╖рдп рдХреЛ рд╕рднреА рдЗрдЪреНрдЫреБрдХ рджреГрд╢реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ:
  for (Iterator<ThemedView> it = views.iterator(); it.hasNext(); ) { if (!it.next().notifyChange()) { it.remove(); } } 

рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░
рдореБрдЭреЗ рдЬрд╛рд╡рд╛ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рд╣рд╛рдВ, Java C. рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред рдпрд╣ Python рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд▓рдЪреАрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ (рд╣рд╛рдБ, рдореЗрд░реЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ "рд╡рд╣" рд╣реИ) рдХрдорд╛рд▓ рдХрд░ рд╕рдХрддреА рд╣реИ:
  1. рдореЗрд░реЗ рд▓рд┐рдП рдХрд░реЛред рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдореИрдВ рдмрд╕ рдЙрд╕реЗ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рдмреАрдпрд░ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╡рд╣ рдПрдХ рдмреЛрддрд▓ рд▓реЗрдиреЗ рдЬрд╛рддреА рд╣реИ, рдЙрд╕реЗ рдЦреЛрд▓рддреА рд╣реИ рдФрд░ рдЬрдм рддрдХ рдореИрдВ рдПрдХ рдЕрджреНрднреБрдд рдкреЗрдп рдХрд╛ рдЖрдирдВрдж рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдмреЛрддрд▓ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж рдЬреАрд╕реА
  2. рдореЗрд░реЗ рд▓рд┐рдП рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рд╕реНрдЯреИрдХ рдкрд░ рдпрд╛ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдереА рдпрд╛ рдирд╣реАрдВред рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд╛рд╡рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ - рдЕрдХреНрд╕рд░ рдпрд╣ рдЙрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  3. рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦреЗрдВред рдЬрд╛рд╡рд╛рд╕рд┐рд╕реНрдЯ, CGLib, java.lang.reflect.Proxy, JSR-269, рдПрдиреЛрдЯреЗрд╢рди, рдкреНрд░рддрд┐рдмрд┐рдВрдм ... рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдореЗрдЯрд╛рдЧреНрд░рд╛рдЙрдорд┐рдВрдЧ рдорд╣рд╛рди рд╣реИ!
  4. рдореЗрд░реЗ рд▓рд┐рдП рдбрд╛рд▓реАред рдФрд░ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ! рдЦреИрд░, рд▓рдЧрднрдЧред рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ рдЖрдк рдЙрд╕ рдкрд░ @SuppressWarning ("рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд, рдХрдЪреНрдЪреЗ рдорд╛рд▓") рдХреЗ рд╕рд╛рде рдЪрд┐рд▓реНрд▓рд╛рддреЗ рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рдж рдЬрдирдХ
  5. рдЬрд╛рд╡рд╛ рдХреЛ рдЧрд░реНрд╡ рдирд╣реАрдВ рд╣реИред рд╡рд╣ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдЙрд╕рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред

рд╣рд╛рдВ, рдЙрд╕рдХреА рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВред рд╡рд╣ рдЪреИрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреА рд╣реИ - рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ (рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕реНрдХрд▓, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдЖрдИрдбреАрдИ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдСрдЯреЛ-рд╕рдмрд╕реНрдЯреЗрд╢рди рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдорджрдж рд╕реЗ рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Android рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдБ, рдпрд╣ рдЙрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рдерд╛ред рд╡рд╣ рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рд╡рд┐рдирдореНрд░ рдорд╣рд┐рд▓рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд╢реЗ рдореЗрдВ рдзреБрдд рдЖрджрдореА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВ рдЙрд╕реЗ рдмрддрд╛рддрд╛ рд╣реВрдВ - рдореБрдЭреЗ рдмреАрдпрд░ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕рдиреЗ рдореБрдЭрд╕реЗ рдХрд╣рд╛ - рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдПрдХ рдЗрд░рд╛рджреЗ рдмрдирд╛рдПрдВ, рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдЦреЛрд▓реЗрдВ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ... рдпрджрд┐ рд╕рдм рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ "рдмреАрдпрд░" рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред рдФрд░ рд╣рд╛рдБ, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдмреАрдпрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдСрдкрд░реЗрд╢рди рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реА рднреБрдЧрддрд╛рди рдХрд░ рджрд┐рдпрд╛ рд╣реЛред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордирднрд╛рд╡рди рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдХ рд╢рд╛рд░реАрд░рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред



рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ Message.obj рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Message.what рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред

Android рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреБрдЫ рдФрд░ рдХрд░рдирд╛ рд╣реИред рдЖрдк Javaassit / CGLib рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЧрддрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИ)ред рдмрд╛рдХреА (рдкреНрд░реЙрдХреНрд╕реА, JSR-269, рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм) рдХреЗ рд╕рд╛рде, рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдкрд╛рдк рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрд╢рд╛рд░реЗ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред

Android рдкрд░ рдЧрд░реНрд╡ рд╣реИред рд╡рд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЬрд╛рдирддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЗрд╕рдХреА рдкреНрд░рдХреГрддрд┐ (рдПрдирдбреАрдХреЗ, рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрджрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд╛рднреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред

рддреЛ, рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЬрд╛рд╡рд╛ рдХреА рдЖрдЬреНрдЮрд╛рдХрд╛рд░рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, WeakReference рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╕рд╛рд╣рд╕реА рдХрд╛рдореБрдХ рдХрд▓реНрдкрдирд╛рдУрдВ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдУрдЖрд░рдПрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛)ред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╛рде, рд░реЛрдорд╛рдВрд╕ рдХреЗ рдмрдЬрд╛рдп, рдмреАрдбреАрдПрд╕рдПрдо рд╢реИрд▓реА рдкрд░ рд╣рд╛рд╡реА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП WeakReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╕реНрддреБрдПрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЬреАрддреЗ рд╣реИрдВ, рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЬреАрд╡рди-рдЪрдХреНрд░ рдХреЗ рдЕрдзреАрдиред рд╣рдореЗрдВ WeakReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрдиреНрд╣реЗрдВ "рдХреНрд▓рд┐рдВрдЧ" рдХрд░рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрджрд░реНрдн рд▓реАрдХ (рд╕рдВрджрд░реНрдн) рдХрд╛ рдХрд╛рд░рдг рди рд╣реЛред рд╢рд╛рдпрдж рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рддрд╣рдд "рдЭреБрдХрдирд╛" рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ "рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ" рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рд╣реЛрдЧрд╛, рдЬрдм рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджреЗрдЦреЗрдВ, рдЕрдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдм рдХреБрдЫ рджреГрд╢реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдХреЗ рддрддреНрд╡ рд▓рдЧрд╛рддрд╛рд░ рджрд┐рдЦрд╛рдИ / рдЧрд╛рдпрдм рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реНрдХреНрд░реАрди рд╕реЗ)ред рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрдордЬрд╝реЛрд░ рд╣реЛрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдХреБрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓ рджреГрд╢реНрдп рднрд╛рдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд╕рднреА рд╡реНрдпреВ рдХреЗрд╡рд▓ рд╡реАрдХрд░рдкреНрд░рд┐рдВрдЯ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдЕрдкрдиреЗ рдереАрдореНрдб рд╡реНрдпреВ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╡рдВрд╢рдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
  private static ThemedView createThemedView(View v, final String base, String element) { ThemeType type = types.get(element); switch (type) { case TILED_BG: return new ThemedView(v) { @Override public void onChange(View v) { Bitmap bmp = decodeBitmap(base + "_bg"); BitmapDrawable bd = new BitmapDrawable(app().getResources(), bmp); bd.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); v.setBackgroundDrawable(bd); } }; case VIEW_COLOR_BG: return new ThemedView(v) { @Override public void onChange(View v) { int color = getColor(base + "_bg"); v.setBackgroundColor(color); if (v instanceof ListView) { // There is an android bug in setCacheColorHint // That caused the IndexOutOfBoundsException // look here: // http://code.google.com/p/android/issues/detail?id=12840 // // Moreover, that bug doesn't allow us to setDrawableCacheColor // for recycled views. That's why we need to perform cleaning up // via reflections // // Fixed in android 4.1.1_r1 try { ((ListView) v).setCacheColorHint(color); } catch (IndexOutOfBoundsException ex) { try { Field mRecycler = AbsListView.class.getDeclaredField("mRecycler"); mRecycler.setAccessible(true); Object recycler = mRecycler.get(v); Method m = recycler.getClass().getDeclaredMethod("clear"); m.setAccessible(true); m.invoke(recycler); } catch (Throwable t) { // No need to report this } } } } }; case VIEW_IMAGE_BG: return new ThemedView(v) { @Override public void onChange(View v) { v.setBackgroundDrawable(decodeDrawable(base + "_bg")); } }; case IMAGE_FG: return new ThemedView(v) { @Override public void onChange(View v) { ((ImageView) v).setImageDrawable(decodeDrawable(base + "_bg")); } }; case TEXT_COLOR: return new ThemedView(v) { @Override public void onChange(View v) { final int color = getColor(base + "_fg"); if (v instanceof TextView) { ((TextView) v).setTextColor(color); } } }; case TEXT_HINT: return new ThemedView(v) { @Override public void onChange(View v) { final int color = getColor(base + "_hint_fg"); if (v instanceof TextView) { ((TextView) v).setHintTextColor(color); } } }; case PAGER: return new ThemedView(v) { @Override public void onChange(View v) { int active = getColor(base + "_active_fg"); int inactive = getColor(base + "_inactive_fg"); int footer = getColor(base + "_footer_bg"); TitlePageIndicator pager = (TitlePageIndicator) v; pager.setSelectedColor(active); pager.setTextColor(inactive); pager.setFooterColor(footer); } }; case DIVIDER: return new ThemedView(v) { @Override public void onChange(View v) { int color = getColor(base + "_divider"); ListView lv = (ListView) v; int h = lv.getDividerHeight(); lv.setDivider(new ColorDrawable(color)); lv.setDividerHeight(h); } }; case TABBUTTON_BG: return new ThemedView(v) { @Override void onChange(View v) { StateListDrawable stateDrawable = new StateListDrawable(); Drawable selectedBd = decodeDrawable(base + "_selected"); stateDrawable.addState(new int[]{android.R.attr.state_selected}, selectedBd); stateDrawable.addState(new int[]{android.R.attr.state_pressed}, selectedBd); stateDrawable.addState(new int[]{}, decodeDrawable(base + "_unselected")); v.setBackgroundDrawable(stateDrawable); } }; case EDITTEXT_COLOR: return new ThemedView(v) { @Override void onChange(View v) { int color = getColor(base + "_fg"); EditText edit = (EditText) v; edit.setTextColor(color); int hintColor = getColor(base + "_disabled_fg"); edit.setHintTextColor(hintColor); } }; case GROUP_TINT: return new ThemedView(v) { @Override void onChange(View v) { int tintColor = getColor(base + "_fg"); ImageView imageView = (ImageView) v; imageView.setColorFilter(tintColor, PorterDuff.Mode.SRC_ATOP); } }; default: throw new IllegalArgumentException("Error in layout: no such type \"" + element + "\" (" + base + ")"); } } 

Type.get (рддрддреНрд╡) рдХреЛрдб рдХреЗрд╡рд▓ рд▓реЛрдЕрд░рдХреЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдирдо рджреЗрддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдбрд┐рдХреЛрдбрд┐рдЯрдореИрдк, рдбреАрдХреЛрдбреЗрдмрд▓ рдФрд░ рдЧреЗрдЯрдХреЛрд▓рд░ рдмрдиреЗ рд░рд╣реЗ:

  private static ResourceInfo findResource(String base, ResourceType type) { return sCurrentProvider.findResource(base, type); } public static Drawable decodeDrawable(String base) { ResourceInfo info = findResource(base, ResourceType.Drawable); return info.getResources().getDrawable(info.getResId()); } public static Bitmap decodeBitmap(String base) { ResourceInfo info = findResource(base, ResourceType.Drawable); return BitmapFactory.decodeResource(info.getResources(), info.getResId(), Util.newPurgeableBitmapOptions()); } public static int getColor(String base) { ResourceInfo info = findResource(base, ResourceType.Color); return info.getResources().getColor(info.getResId()); } 

ThemeProvider рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ sCurrentProvider рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░реНрдп рдЗрд╕рдХреЗ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрд╕рд╛рдзрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред
рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрд╕рд╛рдзрди рдирд╛рдо рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╖рдп рдЖрдИрдбреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛:
  @Override public ResourceInfo findResource(String name, ResourceType type) { int id = IdUtils.getResId(app().getResources(), mPrefix + "_" + name, type.getType(), PACKAGE_NAME); if (id == 0 && mNext != null) { return mNext.findResource(name, type); } return new ResourceInfo(app().getResources(), id); } 

GetResId рд╡рд┐рдзрд┐ Resources.getIdentifier рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╣реИред
MNext рдлрд╝реАрд▓реНрдб рднреА рдПрдХ ThemeProvider рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛, рддреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрдВрдд рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

рдирддреАрдЬрддрди, рдЕрдЧрд▓реЗ рд╡рд┐рд╖рдп рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреИрдЯ рд╡рд┐рдВрдбреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдирд╛рдо:
def_chat_bg
night_chat_bg
pink_chat_bg
wood_chat_bg

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░

рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХреЗрд╡рд▓ рдЖрд╡реЗрджрди рд╕реЗ, рдмрд▓реНрдХрд┐ рдмрд╛рд╣рд░ рд╕реЗ рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╕реНрд░реЛрдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрдХреЗрдЬ рдирд╛рдо рдФрд░ рд╕рдВрд╕рд╛рдзрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, PackageManager.getResourcesForApplication рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ:
  1. рдбрд┐рдЬрд╛рдЗрди рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ - рдХрд┐рдпрд╛
  2. рдкрд░рд┐рд╡рд░реНрддрди "рдЙрдбрд╝рд╛рди рднрд░рдиреЗ" рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  3. рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рд╖рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдмрджрд▓ рдЬрд╛рдП - рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рдХреЛрдИ рдмрд╛рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ
  4. рдореИрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдпрд╛ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдХреЛрдб, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рдлреА рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЖрдк рдПрдХ рдкреНрд▓рд╕ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ
  5. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рд╡рд┐рд╖рдп рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ - рддреИрдпрд╛рд░, рд╕рдВрд╕рд╛рдзрди рдХрд┐рд╕реА рднреА apk рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ


рд▓рдЧрддрд╛ рд╣реИ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреАред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдордиреЛрджрд╢рд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдЧрд╛ - рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рд╡реЗ рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗ!

рдкреБрдирд╢реНрдЪ: рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд╛ рдПрдХ рдорд┐рдирдЯ - рдпрд╣рд╛рдВ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдЬреЗрдВрдЯ рдХрд╛ рдЖрд╡реЗрджрдиред

Source: https://habr.com/ru/post/In178061/


All Articles