Android TV |如何在父视图中居中ListRow项(Horizo​​ntalGridView)

时间:2016-04-21 12:19:14

标签: android android-layout android-recyclerview android-tv leanback

我正在尝试使用Leanback在视频播放器中创建一系列位于播放器控件栏上方的操作项。

动作项是可操作的图像视图的ListRow(表示表情符号反应)。

我的问题:我不能让他们在中心位置,就像主要和辅助控制栏在玩家中心一样。当前列表行如下所示:emojicon items

以下是定义单个操作的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<com.makeramen.roundedimageview.RoundedImageView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/rounded_image_view"
        android:src="@drawable/ic_action_insert_emoticon"
        android:scaleType="fitStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:riv_corner_radius="30dip"
        app:riv_border_width="2dip"
        app:riv_border_color="#333333"
        app:riv_tile_mode="repeat"
        app:riv_oval="true">
</com.makeramen.roundedimageview.RoundedImageView>

实例化每个行项目的演示者:

public class RoundedViewPresenter extends Presenter {
    private static final String TAG = RoundedViewPresenter.class.getSimpleName();

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View rootView = inflater.inflate(R.layout.rounded_image_view, parent, false);
        RoundedImageView roundedImageView = (RoundedImageView) rootView.findViewById(R.id.rounded_image_view);

        //roundedImageView.mutateBackground(true);
        //roundedImageView.setBackground(backgroundDrawable);
        roundedImageView.setFocusable(true);
        roundedImageView.setFocusableInTouchMode(true);
        ((HorizontalGridView)parent).setGravity(Gravity.CENTER);
        return new ViewHolder(roundedImageView);
    } ...

然后在播放器的片段中添加如下行:

// add emoji rows
...
ArrayObjectAdapter emojiRowAdapter = new ArrayObjectAdapter(new RoundedViewPresenter());
emojiRowAdapter.add(mObjectModel0);
emojiRowAdapter.add(mObjectModel1);
emojiRowAdapter.add(mObjectModel2);
emojiRowAdapter.add(mObjectModel3);
ListRow emojiRow = new ListRow(emojiRowAdapter);
mRowsAdapter.add(emojiRow);
...

我已经尝试了android:layout_gravity =“center”和程序化HorizontalGridView.setGravity()方法而没有成功。

知道为什么和/或替代方法使行居中?

4 个答案:

答案 0 :(得分:0)

试试这个属性android:layout_gravity="center_horizontal|center_vertical"

Like below xml code.

<?xml version="1.0" encoding="utf-8"?>
<com.makeramen.roundedimageview.RoundedImageView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/rounded_image_view"
        android:src="@drawable/ic_action_insert_emoticon"
        android:scaleType="fitStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
        app:riv_corner_radius="30dip"
        app:riv_border_width="2dip"
        app:riv_border_color="#333333"
        app:riv_tile_mode="repeat"
        app:riv_oval="true">
</com.makeramen.roundedimageview.RoundedImageView>

It will exact center as you want in your output.

答案 1 :(得分:0)

我相信对齐是Horizo​​ntalGridView的固有属性。我认为问题是网格视图(意味着整个视图)占据了屏幕的宽度。

为了减少视图的大小,您必须以编程方式或通过XML将layout params更改为{{1}},这意味着有意义的最小宽度或提供设置的宽度。

对于其中任何一个,网格将更小,因此您的居中属性将产生明显的效果。

答案 2 :(得分:0)

您可以使用PlaybackControlsRow中的setSecondaryActionsAdapter调用在主控件下添加第二行操作。

请查看:https://android.googlesource.com/platform/development/+/29dadb6d144817840372af52629b4b34c074b78d/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java以获取有关如何操作的示例。

答案 3 :(得分:0)

原来很难将任何基于Horizo​​ntalGridView的行居中,这似乎几乎是使用ListRowPresenter创建的每一行。一切似乎都是左倾的。这里提供的建议似乎都不起作用,所以我决定用我自己的自定义视图替换默认的视频标题/描述码。其他密切相关的问题详情如下:

https://stackoverflow.com/a/37736890/1145905