【问题标题】:Set gravity of a View Programmatically以编程方式设置视图的重力
【发布时间】:2012-05-08 11:53:03
【问题描述】:

我正在通过 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?
  • android:gravity="center_vertical|left",这是我要更改的属性。所以我猜只是重力?我错了吗?
  • 不,我明白了,现在 - 但 Agarwal 是对的:使用实际类型,而不是 View,因为实际类型可能会响应 setGravity

标签: java android view gravity


【解决方案1】:

由于 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));

参考:Source code

【讨论】:

【解决方案2】:

你试过了吗?

clock.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL);

编辑:

由于您不能将setGravity 用于普通的View,因此请执行以下操作,

您可以使用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 方法不适用于此视图。所以它不会编译
  • 时钟是否扩展了某种类型的视图组?还是只是一个通用的视图?扩展视图组可能更有意义,例如 LinearLayout。
  • 我会试一试,不过 HandlerExploit 解决方案似乎也是可行的
  • 是的,这是最好的解决方案,如果我知道您的自定义视图扩展了 TextView,我的答案会是一样的。 +1 他的回答。如果将来您的视图不扩展 TextView,您也可以这样做。谢谢。
【解决方案3】:
 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 以免弄乱您的代码库
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多