Android TV 后退

Posted

技术标签:

【中文标题】Android TV 后退【英文标题】:Android TV Leanback 【发布时间】:2019-04-06 13:48:17 【问题描述】:

我是 android TV 开发的新手。我不知道要使用哪种类型的片段。我想要两个实现类似于上面屏幕截图的布局作为 jiocinema。不知何故,我在活动布局中使用两个 xml 片段实现了它。第二个片段在点击 API 后加载屏幕截图,因此它会在一段时间后加载。从上面的屏幕截图中可以看出,我希望将布局分为两部分。顶部是详细信息和一些按钮,底部是该电影的屏幕截图列表。

在我的情况下,问题是,底部列表部分将重点放在加载此特定屏幕上,然后按下向上按钮或任何按钮,它永远不会失去焦点,也永远不会进入顶部。 注意:下面的片段是异步加载的,因为它会点击一个用于截图 url 的 api

可能是我没有为这个特定的布局使用适当的片段。有人可以指出我的代码或帮助我决定使用什么来进行这种布局。可以实现,但导航是主要的。

代码

活动布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="@color/photo_label_box">
    <fragment
        android:id="@+id/detail_layout"
        android:layout_
        android:name="com.DetailsActivityGame$Detalfragment"
        android:layout_></fragment>
    <fragment
        android:id="@+id/row_layout"
        android:layout_
        android:layout_below="@+id/detail_layout"
        android:name="com.DetailsActivityGame$SampleFragmentC"
        android:layout_></fragment>
</RelativeLayout>

谢谢

【问题讨论】:

【参考方案1】:

尝试使用 V4 Support Fragment 中的 RowSupportFragment 以获得所需的输出。

将布局分为按钮、描述和下方滚动布局两部分布局(由RowSupportFragment表示)

//------------------------detail_layout

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_
android:background="@color/leader_background">
<RelativeLayout
    android:layout_
    android:layout_
    android:id="@+id/main_layout"
  //your own layout design for buttons and description
</RelativeLayout>
<fragment
    android:name="FragmentScreenshots"
    android:id="@+id/screenshot_fragment"
    android:layout_
    android:layout_
    />
    </LinearLayout>

//----------------Detailfragment--------------------

public static class Detailfragment extends Fragment 
    public  Detailfragment() 

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        final View view = inflater.inflate(R.layout.detail_layout, container, false);
        //————————your own implementation—————————————————————————
        return view;
     
     public static class FragmentScreenshots extends RowsSupportFragment 
         private ArrayObjectAdapter mRowsAdapter = null;
          public FragmentScreenshots() 
            mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
            setAdapter(mRowsAdapter);
           

        @Override
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
          //———————Provide data accordinally———————————
             List<ScreenshotItem> list;

             // Add a Related items row
            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
                    new ScreenshotCardPresenter(getActivity()));
            for (ScreenshotItem s:list)
            
                listRowAdapter.add(s);
            
            HeaderItem header = new HeaderItem("Screenshots");
            mRowsAdapter.add(new ListRow(header, listRowAdapter));
            setAdapter(mRowsAdapter);

            setOnItemViewClickedListener(new OnItemViewClickedListener() 
                @Override
                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) 
                    if (item instanceof ScreenshotItem) 
                                                  
                    else
                                                
                
            );

            setOnItemViewSelectedListener(new OnItemViewSelectedListener() 
                @Override
                public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) 

                
            );
        

        @Override
        public void setExpand(boolean expand) 
            super.setExpand(true);
        

        @Override
        public void setOnItemViewClickedListener(BaseOnItemViewClickedListener listener) 
            super.setOnItemViewClickedListener(listener);
        

        @Override
        public void setOnItemViewSelectedListener(BaseOnItemViewSelectedListener listener) 
            super.setOnItemViewSelectedListener(listener);
        
    

【讨论】:

【参考方案2】:

您必须使用BrowseFragment 来达到您的目的。它由 RowsFragment 和 HeadersFragment 组成。

BrowseFragment 将其 ObjectAdapter 的元素呈现为垂直列表中的一组行。此适配器中的元素必须是 Row 的子类。

This tutorial 可以帮助您入门。

【讨论】:

感谢您的回答。但我不需要左抽屉……我还能用吗?我没有因为抽屉而尝试过 为此,您已经在浏览片段中进行了自定义。 我不同意。如果您不需要左侧抽屉(这是 BrowseFragment 的主要用途/组件之一),只需使用 RowsFragment。

以上是关于Android TV 后退的主要内容,如果未能解决你的问题,请参考以下文章

Android TV开发焦点移动源码分析

Android TV 应用无法安装在 Android TV 设备上

Android TV:如何使用 Leanbak 自定义 android TV 的左侧导航面板?

Android-TV 应用显示白屏

Android TV开发总结TV上屏幕适配总结

Android TV开发总结焦点