安卓电视 |如何在父视图中居中 ListRow 项 (HorizontalGridView)
Posted
技术标签:
【中文标题】安卓电视 |如何在父视图中居中 ListRow 项 (HorizontalGridView)【英文标题】: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】:事实证明,将任何基于 HorizontalGridView 的行居中是非常困难的,这似乎是使用 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_horizontal|center_vertical' 不同的结果呢?毕竟,我在源代码中看到它们是相同的:public static final int CENTER = CENTER_VERTICAL|CENTER_HORIZONTAL;
@kip2 我在视频视图中有问题,我想要进度条以及播放按钮和中心,所以我用Center Horizontal
和Center Vertical
设计了它,这就是为什么我建议你这样做.我也在为我的电视应用程序使用leanback,并面临同样的问题。
好吧,我可以确认您的建议对我不起作用。毫不奇怪,因为我上面提到的 2 个重力“变体”基本相同。我可能还缺少其他东西,这就是我需要帮助的地方
@kip2 兄弟你能告诉我你用我的代码得到什么笑脸输出吗? is 显示你的布局有什么变化?
输出与OP中附加的图像完全相同。没有变化,所以我认为不需要重新发布它【参考方案4】:
我相信对齐是 HorizontalGridView 的固有属性。我认为问题在于网格视图,即整个视图,占据了屏幕的宽度。
为了减小视图的大小,您必须以编程方式或通过 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 项 (HorizontalGridView)的主要内容,如果未能解决你的问题,请参考以下文章