以编程方式设置视图重力

25

我正在研究 Android 源代码上的一个 View。我想知道如何将多个重力设置到自定义的 View

以下是 XML 代码:

<com.android.systemui.statusbar.policy.Clock
        android:id="@+id/clock"
        android:textAppearance="@style/TextAppearance.StatusBar.Clock"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:singleLine="true"
        android:paddingLeft="6dip"
        android:gravity="center_vertical|left"
        />

你可以看到, 默认重心是center_vertical|left,所以我的Java代码应该是这样的

    View clock = mStatusBarView.findViewById(R.id.clock);

    if (clock != null) {
        SOMEHOW SET GRAVITY -> mCenterClock ? Gravity.CENTER : (Gravity.CENTER_VERTICAL | Gravity.LEFT);
    }

setGravity方法不能在View上工作。那么有没有一种替代方法可以设置重力而不会丢失默认的宽度和高度?

先行致谢。


你真的需要重力吗?还是你需要layout_gravity? - JRaymond
android:gravity="center_vertical|left",这是我想要更改的属性。所以我猜只需要改变gravity?我错了吗? - user809486
不,我明白了,但Agarwal是正确的:使用实际类型而不是View,因为实际类型很可能会响应setGravity。 - JRaymond
3个回答

41

由于 com.android.systemui.statusbar.policy.Clock 继承自 TextView,只需将其强制转换为 TextView 并设置文本对齐方式即可。

 TextView clock = (TextView) mStatusBarView.findViewById(R.id.clock);
 clock.setGravity(mCenterClock ? Gravity.CENTER : (Gravity.CENTER_VERTICAL | Gravity.LEFT));

参考资料:源代码


你能看一下这里吗? https://github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java还有这里 https://github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/res/layout/status_bar.xml看起来这是最好的方法。我认为你的方法不起作用,因为它是一个线性布局。 - user809486
我最终从AOKP源代码进行了端口,但是你的答案更准确。谢谢。 - user809486

8
你试过吗?
clock.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL);

编辑:

由于您无法对普通的View使用setGravity,因此可以采用以下方法:

您可以使用RelativeLayout并设置如下规则...

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
params.addRule(RelativeLayout.CENTER_HORIZONTAL|RelativeLayout.CENTER_IN_PARENT, clock.getId());

是的,此视图不可用setGravity方法。因此它无法编译。 - user809486
时钟(Clock)扩展了某种类型的ViewGroup吗?还是只是一个通用视图(View)?扩展ViewGroup,例如LinearLayout,可能更有意义。 - ootinii
我会尝试一下,不过 HandlerExploit 的解决方案似乎也是可行的。 - user809486
是的,那是最好的解决方案,如果我知道你的自定义视图扩展了TextView,我的答案也会是一样的。+1给他的答案。如果将来您的视图不再扩展TextView,您也可以这样做。谢谢。 - Arif Nadeem

2
 com.android.systemui.statusbar.policy.Clock clock = (com.android.systemui.statusbar.policy.Clock)mStatusBarView.findViewById(R.id.clock);

 clock.setGravity(Gravity.CENTER_VERTICAL);

尝试上述代码并删除 View clock = mStatusBarView.findViewById(R.id.clock);


或者只需导入 com.android.systemui.statusbar.policy.Clock,以避免在代码库中混乱,如果您喜欢。 - JRaymond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接