ããã«ã¡ã¯ãHabrã®èªè
ã DetailsFragmentã®äŸã䜿çšããŠãAndroid TVçšã®ã¢ããªã±ãŒã·ã§ã³ãéçºããçµéšãå
±æããããšæããŸãã
ããã«å
¬åŒã®äŸãšå
¬åŒã®ããã¥ã¡ã³ãããã
ãŸã ã ç§ã®æèŠãè¡šæããåæ©ã¯äœã§ããïŒ ããã¯ãå
¬åŒã®äŸããã¢ãžã¥ãŒã«æ§ãæ¡åŒµæ§ãªã©ã®ææ°ã®éçºèŠä»¶ãæºãããŠããªãããã§ãã ããããã®ã¡ã«ããºã ã䜿çšãããšãç¹å®ã®äºéæ§ãäœæãããå ŽåããããŸãã DetailsFragmentã詳ããèŠãŠã¿ãŸãããã
ç§ã®æèŠã§ã¯ãAndroidãã©ãããã©ãŒã åãã®ã¢ããªã±ãŒã·ã§ã³ã®éçºãéå§ããã«ã¯ã2ã€ã®åºæ¬çãªçå®ãåãå
¥ããå¿
èŠããããŸãã
- å
¬åŒã®æšå¥šäºé
ããé¢ããŠãã«ã¹ã¿ã ã¢ããªã±ãŒã·ã§ã³ãéçºããããšã¯ãå§ãã§ããŸããã Googleã¯ããããéåžžã«é£ããããšã確èªããŸããã
- ã·ã³ã°ã«ã¢ã¯ãã£ããã£ã¢ãŒããã¯ãã£ãå®å
šã«ã¯é©åãããå
éšã®ãªãŒã³ããã¯ã©ã€ãã©ãªã®å®è£
ã«é¢é£ããã¡ã¢ãªãªãŒã¯ã«æ©ãŸãããŸãã
ãã®ããããŸãæåã«ïŒ
Leanbackã©ã€ãã©ãªã«ã€ããŠç°¡åã«
Leanbackã©ã€ãã©ãªã¯ãããŸããŸãªæ©èœãåããç»é¢ãã³ãã¬ãŒãã®ã³ã¬ã¯ã·ã§ã³ã§ãã ãªã¹ããã³ã³ãã³ãã«ãŒãããã€ã¢ãã°ãªã©ã衚瀺ããç»é¢ããããŸãããããã®ç»é¢ã¯ãèŠçŽ ãšã¢ãã¡ãŒã·ã§ã³ã®éã®ãã¹ãŠã®ãŠãŒã¶ãŒé·ç§»ãåŠçããç°¡åãªããã«äœ¿çšã§ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éåžžã«åºç¯ãªæ©èœãåããŠããŸãã ãã®ã©ã€ãã©ãªã®ã€ããªãã®ãŒã¯ãããã«åºã¥ãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšã«é¢ããŠé¡äŒŒããŠãããšããããšã§ãã ç§ã®å人çãªæèŠã¯ãåžå Žã§ã¢ããªã±ãŒã·ã§ã³ã®åäžæ§ãäœæãããšããéåžžã«è¯ãèãã§ãã ããèããå¿
èŠã¯ãããŸããããŠãŒã¶ãŒã¯äžã«ã¹ã¯ããŒã«ã§ããããšãç¥ã£ãŠããŸããïŒ åœŒã¯ãã§ã«äœçŸãã®é¡äŒŒã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããã®ã§ããããèŠã€ããŸããã
ãããããããžã§ã¯ãã«æ¥ç¶ãããŠããå€æ°ã®ã©ã€ãã©ãªã®ããã«ã補åã«å¯Ÿãã顧客ã®æåŸ
ãšãã®ã©ã€ãã©ãªã®æ©èœãšã®éã«ã¯å€§ããªççŸããããŸãã 1ã€ã®äŸã䜿çšããŠããã®ã¢ããªã±ãŒã·ã§ã³ã®éçºäžã«èªåã®ããã«æãã2ã€ã®äž»èŠãªçµè«ãå°ãåºãããšããŸãã
ãã®ãããDetailsFragmentã¯ã©ã¹
ãã®ã¯ã©ã¹ã¯ããã³ã³ãã³ãã«ãŒããã衚瀺ããããã«äœ¿çšãããŸãã ã³ã³ãã³ãã«ãŒãã¯ãç¹å®ã®ãšã³ãã£ãã£ãªããžã§ã¯ãã«é¢ããå®å
šãªæ
å ±ã衚瀺ããç»é¢ã¹ããŒã¹ã§ãã ã»ãšãã©ã®å ŽåããŠãŒã¶ãŒãåæ§ã®ãšã³ãã£ãã£ãªããžã§ã¯ãã®ãªã¹ãã§äœããã¯ãªãã¯ãããšãã³ã³ãã³ãã«ãŒãã«ã¢ã¯ã»ã¹ããŸãã
DetailsFragmentãšã¯
ãã®ã¯ã©ã¹ã¯ããŠãŒã¶ãŒè¡šçŸã®éåã€ã¡ãŒãžã§ãã è«çæ§é ã¯æ¬¡ã®ãšããã§ãã

ã©ã®èŠçŽ ãäœãããã®ãèŠãŠã¿ãŸãããã
- ArrayObjectAdapterã¯ãç»é¢äžã®ãã¹ãŠã®èŠçŽ ãåéããã¯ã©ã¹ã§ãã
- DetailsOverviewRow-ã¡ã€ã³ã¢ããã¿ãŒã®äžéšã§ãããæ©èœèŠçŽ ïŒã¢ã¯ã·ã§ã³ïŒãæ
å ±ïŒDescriptionViewïŒãããã³ã³ã³ãã³ãã«ãŒãã®ç»åã衚瀺ããŸãã
- è¿œå è¡-ã³ã³ãã³ãã«ãŒãã®æ©èœãæ¡åŒµããè¿œå èŠçŽ ããã®è¡ã«å
¥ããŸãã
ãã®ãããäžèŠãããšããã圹å²ãæ確ã«åæ£ãããäœããã®ãå
¥ãå人圢ããããã ãã§ãïŒå®éãããããããã¯åŸã§èª¬æããŸãïŒã
DetailsOverviewRowã®åºæ¬çãªæŠå¿µã«ã€ããŠã®ã¿èª¬æããŸããããã¯ãç§ã®æèŠã§ã¯éåžžã«èå³æ·±ãããã§ãã
DetailsOverviewRowã¯ã©ã¹ã«ã¯ã次ã®äž»èŠãªã¡ãœããããããŸãã
- setImageDrawableïŒDrawable drawableïŒ-ãã®ã¡ãœããã¯ãã³ã³ãã³ãã«ãŒãã®ãã¢ãã¿ãŒããèšå®ããŸãã ã¢ãã¿ãŒãèšå®ããå¥ã®æ¹æ³ã¯ãsetImageBitmapïŒã³ã³ããã¹ãã³ã³ããã¹ããããããããbmïŒã§ãã
- void setActionsAdapterïŒObjectAdapter adapterïŒ-ã³ã³ãã³ãã«ãŒãã€ãã³ãçšã®ã¢ããã¿ãŒã®ã€ã³ã¹ããŒã«ïŒããšãã°ã賌å
¥/èŠèŽ/ãæ°ã«å
¥ããžã®è¿œå ãªã©ïŒã ObjectAdapterã¯æœè±¡ã¯ã©ã¹ã§ãã ãªãŒã³ããã¯ã§ã¯ãå€å
žçãªæ§é ïŒArrayObjectAdapterãªã©ïŒã«ããã€ãã®å®è£
ããããŸãã ObjectAdapterã«ããŸããŸãªã¯ã©ã¹ãè¿œå ã§ããŸãããã®å Žåãæšæºã®Actionã¯ã©ã¹ã«é Œãããšãã§ããŸãã
- DescriptionViewãèšå®ããã«ã¯ãç¹å®ã®ã¢ãã«ãåãå
¥ããDetailsOverviewRowã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸãã
DetailsOverviewRowãã¢ãã«ã«è¡šç€ºããæ
å ±ãã©ã®ããã«é
眮ããã®ã ãããïŒ ãã®ãã£ã¹ãã¬ã€ã®ããŒã¯ã¢ããã¯ã©ãã§ååŸãããŸããïŒ
ãã¬ãŒã³ã¿ãŒïŒåŸæ¥ã®MVPã§ã¯ãªãïŒ
ããŸããŸGoogleããå
éšãã¥ãŒã®ãã¬ãŒã ã¯ãŒã¯ã§ãã®ã¢ãã«ãŸãã¯ãã®ã¢ãã«ãã©ã®ããã«èŠããããæ
åœããã¯ã©ã¹ããã¬ãŒã³ã¿ãŒãšåœåããŸããã ããã«ã䟿å®äžãUIãã¬ãŒã³ã¿ãŒãšåŒã³ãŸãã
UIãã¬ãŒã³ã¿ãŒãããã¯åºæ¬çã«ããŒã¿ãªããžã§ã¯ããŸãã¯ãšã³ãã£ãã£ãªããžã§ã¯ããç»é¢ã«è¡šç€ºãããæ¹æ³ã§ãã å€å
žçãªã¢ã³ããã€ãã®éçºããé¡æšãããšãã¢ããã¿ãŒããã¹ãŠã§ãã
DescriptionViewã®å Žåãã¢ãã«ãç¹å®ã®ãŠãŒã¶ãŒãã¥ãŒã«é
眮ããUIãã¬ãŒã³ã¿ãŒãäœæããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãäž»ã«2ã€ã®æ¹æ³ããããŸãã
- FullWidthDetailsOverviewRowPresenter-ãã®ã¯ã©ã¹ã¯RowPresenterã®åå«ã§ãã DetailsOverviewRowã®å
šç»é¢è¡šç€ºã§ãã å€èŠ³ïŒ
- DetailsOverviewRowPresenter-ãµããŒããããªããªããŸããã äžå³ã®ããã«è¡šç€ºãããŸã
ãã®çµæãããã«äœ¿çšã§ãã代æ¿æ段ããªããããFullWidthDetailsOverviewRowPresenterãéžæããŸãã
ãã¬ãŒã³ã¿ãŒUIã®äœæã¯æ¬¡ã®ããã«ãªããŸãã
FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter( new DetailsDescriptionPresenter(context))
DetailsDescriptionPresenterã¯ãPresenterããæ¡åŒµãããã¯ã©ã¹ã§ãã ãšã³ãã£ãã£ãªããžã§ã¯ãã®ãŠãŒã¶ãŒè¡šç€ºãæ
åœããŸãïŒã»ãšãã©ã®å Žåãååãšèª¬æã瀺ããŸãïŒã
åè¿°ã®ããã«ãUIãã¬ãŒã³ã¿ãŒã¯ãå€å
žçãªAndroidã®ã¢ããã¿ãŒã«é¡äŒŒããŠããŸãã 次ã®æ¹æ³ãå¿
èŠã§ãã
- ViewHolder onCreateViewHolderïŒViewGroup芪ïŒ-ãã®ã¡ãœããã¯ãViewHolderãªããžã§ã¯ããäœæããããã«èšèšãããŠããŸãã ããã§ãã«ã¹ã¿ã ãã¥ãŒãäœæããŠViewHolderã«æž¡ãããšãã§ããŸãã
- void onBindViewHolderïŒViewHolder viewHolderããªããžã§ã¯ãé
ç®ïŒ-ViewHolderãæ§ç¯ããæ¹æ³ã ã芧ã®ãšãããããŒã¿ãªããžã§ã¯ãã¯Javaãªããžã§ã¯ããšããŠæž¡ããããããããã¯å°ãæ»ããããç¶æ³ã§ãã ããŠã³ã¹ããªãŒã å€æã誀ã£ãŠäœ¿çšãããšãã©ã³ã¿ã€ã ãšã©ãŒã衚瀺ãããå ŽåããããŸãã
- void onUnbindViewHolderïŒViewHolder viewHolderïŒ-ãã®ã¡ãœããã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãå®å
šã«åé€ã§ããããã«ããã«ããŒããªãœãŒã¹ãã解æŸããããã«äœ¿çšãããŸãã
å
šäœå
Android TVãããžã§ã¯ãå
šäœãéããŠãã«ã¹ã¿ã ãã¬ãŒã³ããŒã·ã§ã³ã§ArrayObjectAdapterã䜿çšããŸãããããããã¬ãŒã³ã¿ãŒãã¡ã¯ããªã䜿çšããŸãã ãããã¯äºãã«åã蟌ãŸããŠããã ãã§ãããç¹å®ã®ç»é¢ã®å®è£
ã§ã¯1ã€ãŸãã¯å¥ã®åœ¢åŒã®ãã¬ãŒã³ããŒã·ã§ã³ãæäŸããããšãèŠããŠãã䟡å€ããããŸãã ããšãã°ãAbstractCardPresenterãšãããã¬ãŒã³ã¿ãŒUIç¶æ¿ã¯ã©ã¹ãäœæããŸããã ãã®ã¯ã©ã¹ã¯ãå€èŠ³ã®ã¬ãã«ã§ã®å€æã§äžèŠåæ§ãæ»ããã«ãããããäœåºŠãå©ããŠãããŸããã ã«ãŒãã®åºæ¬çãªãã¬ãŒã³ããŒã·ã§ã³ãäœæããŸããã ããã«ãããå¿
èŠã«å¿ããŠæ¢è£œã®ãã¥ãŒãåå©çšããã«ãŒããéšåçã«ã«ã¹ã¿ãã€ãºããããšãã§ããŸããã
AbstractCardPresenter public abstract class AbstractCardPresenter<T extends BaseCardView> extends Presenter { private static final String TAG = "AbstractCardPresenter"; private final Context mContext; public AbstractCardPresenter(Context context) { mContext = context; } public Context getContext() { return mContext; } @Override public final ViewHolder onCreateViewHolder(ViewGroup parent) { T cardView = onCreateView(); return new ViewHolder(cardView); } @Override public final void onBindViewHolder(ViewHolder viewHolder, Object item) { Card card = (Card) item; onBindViewHolder(card, (T) viewHolder.view); } @Override public final void onUnbindViewHolder(ViewHolder viewHolder) { onUnbindViewHolder((T) viewHolder.view); } public void onUnbindViewHolder(T cardView) { } protected abstract T onCreateView(); public abstract void onBindViewHolder(Card card, T cardView); }
ãå
¬åŒã®æšå¥šäºé
ããé¢ããã®ã¯æªãèãã§ããïŒã
ç§ãã¡ã®ããã«æ³šææ·±ãæžãããã¯ã©ã¹ã§ã¯ãã»ãšãã©ã®ã¡ãœããã匷åãªå
éšã³ããŒã¬ã³ã¹ã®åçŽãªçç±ã§äžå€ã§ãããšããäºå®ã®ããã«æªãã§ãã ç»é¢ã®å
éšç¶æ
ã劚ããªãããã«ããããïŒå®éã«ã¯DetailsFragmentãªã©ã¯ãã©ã°ã¡ã³ãã§ãïŒãæå³ãããšããã«äœ¿çšããå¿
èŠããããŸãã å
éšã¯ã©ã¹ã®å®è£
ãã¹ããŒããã·ã³ãããã³ãã®ã©ã€ãã©ãªã®éçºè
ã®ä»ã®ã¢ã€ãã¢ã«ã€ããŠã¯è©³ãã説æããŸããã ç§ã®ä»äºããã®å®éã®äŸã¯ãSingle Activity Architectureã䜿çšãããšãã®ãã©ã°ã¡ã³ãå
šäœã®ãªãŒã¯ã§ãã
ãã®ãªãŒã¯ã¯ãDetailsFragmentã®é·ç§»ã«é¢é£ããŠããŸããã è©Šè¡é¯èª€ãéããŠããªãŒã¯ã®åå ãèŠã€ãããªãŒã¯ãæé€ãããã°ã«ã¬ããŒããæžã蟌ãããšãã§ããŸããã ãã¬ãèªäœã®äœé»åïŒSony Brawia 4K 2GB RAMïŒãèãããšãOOMã®åé¡ã¯éåžžã«æ·±å»ã§ãã ãããã®é·ç§»ããŒãã«ããããšã«ãããæŒãã解æ¶ãããŸãã ã¢ã¯ãã£ããã£éã®é·ç§»ã䜿çšããå Žåããã®åé¡ã¯èŠ³å¯ãããŸããã§ããã
TransitionHelper.setReturnTransition(getActivity().getWindow(), null); TransitionHelper.setEnterTransition(getActivity().getWindow(), null);
ç®±ããåºããŠãæ©èœããŸããïŒ
ãããŸãã¯ãã®è¡šç€ºãå€æŽããïŒé¡§å®¢ãå¿
èŠãšããïŒæ¬åœã«ãããå Žåã¯ããããè¡ãããšãã§ããŸããç§ã¯åºäŒã£ãäŸã§æããŸãã Android TVåãã®éçºã®çµéšãããå€ãã®å¶çŽèŠå ãèŠãŠããŸãããã©ã€ãã©ãªã«ãã£ãŠäœæãããå
éšãã©ã°ã¡ã³ãã远跡ããããšã¯äžå¯èœã§ãã 圌ãã®ã©ã€ããµã€ã¯ã«ã¯èª°ã«ãæ¯é
ãããŠããŸããã ãã¶ã€ããŒã§ã«ã¹ã¿ã ãã¥ãŒãäœæããããã®åŒã³åºãïŒéåæããŒã¿ã¯äœ¿çšã§ããŸããïŒã Googleã¯ããããŠããŒããæžãããšãã§ããªãããã«ã»ãŒãã¹ãŠãè¡ããŸããã çŸä»£ã®èŠæ±ãèãããšãæè»æ§ã®ãªãã¡ã«ããºã ã¯æªããã®ã§ãããå¿
èŠã§ã¯ãããŸãããã代æ¿æ段ããªãããïŒç¬èªã®ãªãŒã³ããã¯ãæžãããšãé€ããŠïŒãèªåãæã£ãŠãããã®ãšäžç·ã«çããªããã°ãªããŸããã
ããã¯ã¹ã®å®è£
ã«æåã«æ³šç®ããã®ã¯ãã³ã³ãã³ãã«ãŒãã®ã¢ãã¿ãŒã§ãã ãã©ãŒã«ã¹ãäžäžã«åãæ¿ãããšãå®å
šã«æºå ŽäžèŽã§åçž®ããŸãã
ãã®ãã¥ãŒãæ
åœããã¯ã©ã¹ã®æ€çŽ¢ãçµã蟌ãã åŸãç§ã¯FullWidthDetailsOverviewRowPresenterã¯ã©ã¹ã®å®è£
ã«åãããã©ã®ããã«åãã®ããšãã質åã«å¯ŸããçããèŠã€ããŸããã ã³ã³ãã³ãã«ãŒãã®ã¢ãã¿ãŒã移åããã¡ãœãã-void onLayoutLogoïŒViewHolder viewHolderãint oldStateãboolean logoChangedïŒãèŠã€ããããšãã§ããŸããã
ããã©ã«ãã®å®è£
ã¯æ¬¡ã®ãšããã§ãã
protected void onLayoutLogo(ViewHolder viewHolder, int oldState, boolean logoChanged) { View v = viewHolder.getLogoViewHolder().view; ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); switch (mAlignmentMode) { case ALIGN_MODE_START: default: lp.setMarginStart(v.getResources().getDimensionPixelSize( R.dimen.lb_details_v2_logo_margin_start)); break; case ALIGN_MODE_MIDDLE: lp.setMarginStart(v.getResources().getDimensionPixelSize(R.dimen.lb_details_v2_left) - lp.width); break; } switch (viewHolder.getState()) { case STATE_FULL: default: lp.topMargin = v.getResources().getDimensionPixelSize(R.dimen.lb_details_v2_blank_height) - lp.height / 2; break; case STATE_HALF: lp.topMargin = v.getResources().getDimensionPixelSize( R.dimen.lb_details_v2_blank_height) + v.getResources() .getDimensionPixelSize(R.dimen.lb_details_v2_actions_height) + v .getResources().getDimensionPixelSize( R.dimen.lb_details_v2_description_margin_top); break; case STATE_SMALL: lp.topMargin = 0; break; } v.setLayoutParams(lp); }
å®è£
ãèŠã€ãã£ãããonLayoutLogoã¡ãœãããåå®çŸ©ããŠå®è£
ãèšè¿°ããç¶æ¿ã¯ã©ã¹FullWidthDetailsOverviewRowPresenterãäœæããŸããã
public class CustomMovieDetailsPresenter extends FullWidthDetailsOverviewRowPresenter { private int mPreviousState = STATE_FULL; public CustomMovieDetailsPresenter(final Presenter detailsPresenter) { super(detailsPresenter); setInitialState(FullWidthDetailsOverviewRowPresenter.STATE_FULL); } @Override protected void onLayoutLogo(final ViewHolder viewHolder, final int oldState, final boolean logoChanged) { final View v = viewHolder.getLogoViewHolder().view; final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); lp.setMarginStart(v.getResources().getDimensionPixelSize( android.support.v17.leanback.R.dimen.lb_details_v2_logo_margin_start)); lp.topMargin = v.getResources().getDimensionPixelSize(android.support.v17.leanback.R.dimen.lb_details_v2_blank_height) - lp.height / 2; switch (viewHolder.getState()) { case STATE_FULL: default: if (mPreviousState == STATE_HALF) { v.animate().translationY(0); } break; case STATE_HALF: if (mPreviousState == STATE_FULL) { final float offset = v.getResources().getDimensionPixelSize(android.support.v17.leanback.R.dimen.lb_details_v2_actions_height) + v .getResources().getDimensionPixelSize(android.support.v17.leanback.R.dimen.lb_details_v2_description_margin_top)+lp.height/2; v.animate().translationY(offset); } break; } mPreviousState = viewHolder.getState(); v.setLayoutParams(lp); } }
ãã®å Žåããã¹ãŠãæ¯èŒçåçŽã«æ±ºå®ãããç»é¢ãããŠã³ããç¶æ
ã§ããã®èåŸã«ããã³ã³ãã³ãã«ãŒãã®ã¢ãã¿ãŒãã¢ãã¡ãŒã·ã§ã³åããŸãã éå§äœçœ®ã«æ»ããšãã¢ãã¿ãŒãã¢ãã¡ãŒã·ã§ã³ã§äžã«ç§»åããŸãã ããããã¡ãœãããfinalãšå®£èšãããŠããããã¢ã¯ã»ã¹ã§ããªãå ŽåããããŸãããã®åŸããªãã¬ã¯ã·ã§ã³ã«é ŒããŸããã ãªãã¬ã¯ã·ã§ã³ã¯å€ãã®æ¬ ç¹ãããããã極端ãªæ®µéã§ãã
- ã©ã€ãã©ãªãæŽæ°ãããšãã«ããªãã¬ã¯ã·ã§ã³ãä»ããŠã¢ã¯ã»ã¹ãããã£ãŒã«ãã®ååãå€æŽãããããããã«æªãããšã«ãåé€ãããããšããããŸã
- ãªãã¬ã¯ã·ã§ã³ã¯ãããªããªãœãŒã¹ãéäžçã«äœ¿çšããæäœã§ãããå€ãã®å Žåããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«åé¡ãåŒãèµ·ãããŸãã
- åå°ã¯èªã¿ã«ãããç¶æãã«ãã
èšãæããã°ããªãã¬ã¯ã·ã§ã³ã¯ç§ãäžåºŠé Œãã æåŸã®æ段ã§ãã ããããã©ã®ããã«-ç§ã¯ã¡ã«ããºã ãèŠããŠããŸãã
Android TVã¢ããªã±ãŒã·ã§ã³ã®éå±€åã¢ãŒããã¯ãã£ã«ã€ããŠå°ã
ãã®å Žåããã¹ãŠãæ¯èŒçåçŽã§ãããèŠçŽ ãã©ãã«å±ããŠããããæ£ç¢ºã«ç解ããããšãå°é£ãªå Žåããããããåé¡ã¯ãŠãŒã¶ãŒè¡šçŸã®å±€ã§ã®ã¿çºçããŸãã DetailsFragmentã䜿çšããäŸã«æ»ããšãå®éã®ã¿ã¹ã¯ã¯ã»ãŒæ¬¡ã®ããã«ãªããŸããã³ã³ãã³ãã賌å
¥ãããŠããå Žåã¯ããWatchããã¿ã³ã衚瀺ããŸãã ã³ã³ãã³ããã¬ã³ã¿ã«ããå Žåã¯ãèŠèŽãã¿ã³+ã¬ã³ã¿ã«çµäºæéãªã©ã衚瀺ããŸãã ãã®ãã¹ãŠã§ããã¬ãŒã©ãŒãã¿ã³ããæ°ã«å
¥ãã«è¿œå ãããã¿ã³ãªã©ããããŸãã ç§ã®æèŠã§ã¯ããã¬ãŒã³ã¿ãŒïŒMVPïŒã¯äœããã®ã¢ãã«ãåãåããaddActionã¡ãœããïŒandroid.support.v17.leanback.widget.Actionã¢ã¯ã·ã§ã³ïŒãåŒã³åºãå¿
èŠããããŸãã ã€ãŸãããã¬ãŒã³ã¿ãŒã¯ãããŒã¿ã«åºã¥ããŠãè¿œå ããå¿
èŠããããã¿ã³ã決å®ããããããçæããŠã察å¿ããå€éšã€ã³ã¿ãŒãã§ã€ã¹ãã¥ãŒã¡ãœãããåŒã³åºããŸãã ããã§ã¯ããã¬ãŒã³ã¿ãŒããªãŒã³ããã¯ã©ã€ãã©ãªã«äŸåãããšããåé¡ãçŸããŸãã è¯ãããšã«ã¯ããã®ãã¬ãŒã³ã¿ãŒãããã°ã©ã ã®ä»ã®éšåãããšãã°ã¢ãã€ã«ããã€ã¹ã§äœ¿çšããå¿
èŠããããããåé¡ã¯ããªãæ¥æ¿ã«çºçããŸãã ãããã£ãŠãç§ã¯ãåå ããŠãããããžã§ã¯ãã§ãã¬ãŒã³ã¿ãŒãéçºããããã®ã«ãŒã«ãå°å
¥ããŸãã-ãã¬ãŒã ã¯ãŒã¯ã«é¢é£ä»ããããŠãããã¬ãŒã³ã¿ãŒã§æé»çãªäŸåé¢ä¿ã宣èšããŸããã
ãããåé¿ããããã«ããã¬ãŒã³ã¿ãŒã§ããŒã«ã«ã¢ããã°android.support.v17.leanback.widget.Actionã䜿çšããããšã決å®ãããŸããã ããã«ãããã¬ãŒã³ã¿ãŒã®å€ãã®åé¡ã解決ããŸãããããã¥ãŒã§ã¯ãªãŒã³ããã¯ã«ãã£ãŠæäŸããããŠã£ãžã§ãããéåžžã«ããŸãæäœã§ãããããã¯ãªãã¯ã®è¿œå ãšåŠçã®äœçœ®ã®åŠçã«é¢é£ãããã¥ãŒã§2ã€ã®è«çãçæããŸããã ãã¿ã³ã®ã»ãããæåã¯äžæãªå Žåã«ãåãäºéã®ããžãã¯ã衚瀺ãããŸããããããã«ã¯ç¹å®ã®åªå
é äœããããŸãã ããšãã°ããèŠèŽããã¿ã³ã¯äºåç·šãã¿ã³ã®åã«ã賌å
¥ãã¿ã³ã¯äºåç·šã®åŸãã«ããå¿
èŠããããŸãã ãããã£ãŠããã¿ã³ã®èå¥åãšãããã®äœçœ®ãæ¯èŒããç¹å®ã®ã¡ã«ããºã ããã¥ãŒã«è¡šç€ºãããèå¥åãäžçš®ã®ã衚瀺ã®åªå
é äœãã«ããŸãã ç§ã¯ãã®ç¶æ³ãããªãç°¡åã«åé¿ããŸããããããã§ãããã¥ãŒã¯ããžãã¯ãç²åŸãå§ãããããåãªãèå¥åã§ã¯ãªãããšãç¥ã£ãŠããŸãã
private final List<Integer> mActionsIndexesList = new ArrayList<>(); @Override public void addAction(final MovieDetailAction movieDetailAction) { final Action action = new Action(movieDetailAction.getId(), movieDetailAction.getTitle(), movieDetailAction.getSubTitle(), movieDetailAction.getIcon()); actionAdapter.set(movieDetailAction.getId(), action); mActionsIndexesList.add(movieDetailAction.getId()); Collections.sort(mActionsIndexesList); } @Override public void setSelectedAction(final int actionId) { new Handler().postDelayed(() -> mActionsGridView.smoothScrollToPosition(getActionPositionByActionId(actionId)), 100); } private int getActionPosition(final int actionId) { return mActionsIndexesList.indexOf(actionId); }
çµè«ãšããŠ
Android Tvã®ã¢ããªã±ãŒã·ã§ã³éçºã¯æ¯èŒçæ°ãããããèå³æ·±ããã®ã§ãã å·çæç¹ã§ã¯ãAndroid Tvéçºè
ã³ãã¥ããã£ã¯åæ£åãããŠãããããã»ãšãã©ã®åé¡ã¯ããã©ãã¯ãèžã¿ã€ã¶ããããšã§è§£æ±ºãããŸãã ãŸããç§ã®æèŠã§ã¯ãéããããªãœãŒã¹ïŒRAMãåŠçèœåãªã©ïŒã®ãã¬ãŒã ã¯ãŒã¯ã§ã®ããã°ã©ãã³ã°ã¯éåžžã«èå³æ·±ãã§ãã ãã®ãããªèãæ¹ã®ãã¿ãŒã³ã¯ãå€å
žçãªAndroidã¢ããªã±ãŒã·ã§ã³ã®éçºè
ã«åžžã«ç¹æã®ãã®ã§ã¯ãªããç§ã®æèŠã§ã¯æçšãªçµéšã§ãã