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

Posted

技术标签:

【中文标题】安卓电视 |如何在父视图中居中 ListRow 项 (Horizo​​ntalGridView)【英文标题】:Android TV | How to Center ListRow Items within a parent view (HorizontalGridView) 【发布时间】:2016-08-14 15:27:09 【问题描述】:

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

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

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

这是定义单个操作的 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_
        android:layout_
        android:layout_gravity="center"
        app:riv_corner_radius="30dip"
        app:riv_border_
        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() 方法,但均未成功。

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

【问题讨论】:

直接在Play Back Overlay Activity Layout 中进行,而不是膨胀另一个圆形图像视图布局,这只会满足您的要求。据我所知,它们不是您可以以编程方式执行的任何其他方法。 @jaydroider,我不能在 Activity 中充气,因为我们需要这个自定义行来覆盖视频播放,就像播放器控件行被覆盖一样。这将确保自定义行在播放过程中与其他辅助视图一起消失,并在 dpad 操作时重新出现 【参考方案1】:

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

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

【讨论】:

嗨,Isaac,我考虑过这个选项,但由于设计限制,我们不得不将其保留在主控件行上方【参考方案2】:

事实证明,将任何基于 Horizo​​ntalGridView 的行居中是非常困难的,这似乎是使用 ListRowPresenter 创建的几乎每一行。一切似乎都是左对齐的。这里提供的建议似乎都不起作用,所以我决定用我自己的自定义视图替换默认的视频标题/描述停靠栏。其他密切相关的问题中的详细信息:

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

【讨论】:

【参考方案3】:

试试这个属性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_
        android:layout_
        android:layout_gravity="center_horizontal|center_vertical"
        app:riv_corner_radius="30dip"
        app:riv_border_
        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.

【讨论】:

这似乎没有任何改变。为什么 'center' 会产生与 'center_horizo​​ntal|center_vertical' 不同的结果呢?毕竟,我在源代码中看到它们是相同的:public static final int CENTER = CENTER_VERTICAL|CENTER_HORIZONTAL; @kip2 我在视频视图中有问题,我想要进度条以及播放按钮和中心,所以我用Center HorizontalCenter Vertical 设计了它,这就是为什么我建议你这样做.我也在为我的电视应用程序使用leanback,并面临同样的问题。 好吧,我可以确认您的建议对我不起作用。毫不奇怪,因为我上面提到的 2 个重力“变体”基本相同。我可能还缺少其他东西,这就是我需要帮助的地方 @kip2 兄弟你能告诉我你用我的代码得到什么笑脸输出吗? is 显示你的布局有什么变化? 输出与OP中附加的图像完全相同。没有变化,所以我认为不需要重新发布它【参考方案4】:

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

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

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

【讨论】:

我曾尝试像这样在父视图上 wrap_content,但没有成功:LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; parent.setLayoutParams(layoutParams); parent.requestLayout(); HorizontalGridView 的高度和宽度是 match_parent 还是 wrap_content 在上面的sn-p中可以看到,两者都是WRAP_CONTENT。我也尝试过 MATCH_PARENT,但没有显着变化

以上是关于安卓电视 |如何在父视图中居中 ListRow 项 (Horizo​​ntalGridView)的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码中将我的 UILableView 居中在父 RoundedRectView 中?

在父 UIView 中垂直居中 UILabel

安卓怎么设置textview内容

无法在导航项 iOS8 的标题视图中居中 UILabel

使用图像视图在 PageRow 元素之间导航

ActionBar - 具有居中 ImageView 的自定义视图,两侧的操作项