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

Android TV | How to Center ListRow Items within a parent view (HorizontalGridView)

我正在尝试使用 Leanback 创建一排操作项,这些操作项位于视频播放器播放器控制栏正上方的中央。

操作项是可操作的图像视图列表行(代表表情符号反应)。

我的问题:我无法让它们位于中心位置,就像主要和次要控制栏以播放器为中心一样。当前列表行显示如下:

这是定义单个操作的 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() 方法,但都没有成功。

知道为什么 and/or 使行居中的替代方法吗?

试试这个 属性 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.

我认为对齐是 Horizo​​ntalGridView 固有的 属性。我认为问题在于网格视图,即整个视图,占据了屏幕的宽度。

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

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

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

查看:https://android.googlesource.com/platform/development/+/29dadb6d144817840372af52629b4b34c074b78d/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java 了解如何操作的示例。

原来很难将任何基于 Horizo​​ntalGridView 的行居中,这似乎几乎是使用 ListRowPresenter 创建的每一行。一切似乎都是左对齐的。 None 此处提供的建议似乎有效,因此我决定用我自己的自定义视图替换默认视频 title/description 停靠栏。其他密切相关问题的详细信息: