Устанавливать гравитацию вида программно
Im работает над View
над исходным кодом Android. Мне было интересно, как мы можем настроить множественные гравитации, в пользовательский 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
. Итак, есть альтернатива установки силы тяжести, не теряя по умолчанию ширину и высоту?
Спасибо заранее.
Ответы
Ответ 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));
Ссылка: Исходный код
Ответ 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());
Ответ 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);