Установить гравитацию представления программно

Я работаю над исходным кодом 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. Так есть ли альтернатива установке гравитации без потери ширины и высоты по умолчанию?

Заранее спасибо.


person user809486    schedule 27.04.2012    source источник
comment
вам действительно нужна гравитация или вам нужна layout_gravity?   -  person JRaymond    schedule 27.04.2012
comment
android:gravity=center_vertical|left, это атрибут, который я хочу изменить. Я так понимаю, это просто гравитация? Я ошибаюсь?   -  person user809486    schedule 27.04.2012
comment
нет, теперь я понимаю, но Агарвал прав: используйте фактический тип, а не вид, так как фактический тип, скорее всего, будет реагировать на setGravity   -  person JRaymond    schedule 27.04.2012


Ответы (3)


Поскольку 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));

Ссылка: Исходный код

person HandlerExploit    schedule 27.04.2012
comment
Не могли бы вы взглянуть здесь github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/src/ и здесь github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/res/ Похоже, это лучший способ. Я думаю, что ваш способ не работает, потому что это linearLayout. - person user809486; 27.04.2012
comment
Я закончил тем, что перенес код из источника AOKP, однако ваш ответ был более точным. Спасибо. - person user809486; 27.04.2012

Ты пытался?

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());
person Arif Nadeem    schedule 27.04.2012
comment
Да. Метод setGravity недоступен для этого представления. Так что не компилируется - person user809486; 27.04.2012
comment
расширяет ли Clock определенный тип группы просмотра? Или просто общий вид? Возможно, имеет смысл расширить группу просмотра, например LinearLayout. - person ootinii; 27.04.2012
comment
Я попробую, но решение HandlerExploit тоже возможно. - person user809486; 27.04.2012
comment
Да, это лучшее решение, мой ответ был бы таким же, если бы я знал, что ваш пользовательский вид расширяет TextView. +1 за его ответ. Вы также можете сделать это, если в будущем ваш вид не расширит TextView. Спасибо. - person Arif Nadeem; 27.04.2012

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

person Shankar Agarwal    schedule 27.04.2012
comment
Или просто импортируйте com.android.systemui.statusbar.policy.Clock, чтобы не загромождать кодовую базу, если хотите. - person JRaymond; 27.04.2012