2012-04-27 3 views
15

Im Arbeiten an einem View über Android-Quellcode. Ich frage mich, wie können wir mehrere Schwerkräfte Setup, um eine benutzerdefinierte ViewSetzen Sie die Schwerkraft einer Ansicht programmgesteuert

Dies ist die XML ist

<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" 
     /> 

Wie Sie sehen, Standardschwerkraft center_vertical ist | links, so dass mein Java-Code so etwas wie dieses

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

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

setGravity-Methode funktioniert nicht auf View. Gibt es also eine Alternative, die Schwerkraft einzustellen, ohne die Breite und Höhe standardmäßig zu verlieren?

Vielen Dank im Voraus.

+0

tun Sie wirklich Schwerkraft oder wollen Sie layout_gravity wollen? – JRaymond

+0

android: gravity = "center_vertical | left", das ist das Attribut, das ich ändern möchte. Also ich denke, ist nur die Schwerkraft? Liege ich falsch? – user809486

+0

nein, ich verstehe, jetzt - aber Agarwal hat Recht: Verwenden Sie den tatsächlichen Typ, nicht anzeigen, da der tatsächliche Typ wird wahrscheinlich auf setGravity reagieren – JRaymond

Antwort

31

Da com.android.systemui.statusbar.policy.Clock erweitert TextView nur in eine TextView werfen und die Schwerkraft einstellen.

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

Ref: Source code

+0

Könnten Sie einen Blick hier https://github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java und hier https: //github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/res/layout/status_bar.xml Scheint wie ist der beste Weg. Ich denke dein Weg funktioniert nicht, weil es ein lineares Layout ist. – user809486

+0

Ich endete mit der Portierung von Code aus AOKP-Quelle, aber Ihre Antwort war die genauere.Vielen Dank. – user809486

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

clock.setGravity(Gravity.CENTER_VERTICAL); 

versuchen, den obigen Code und View Uhr entfernen = mStatusBarView.findViewById (R.id.clock);

+0

Oder importieren Sie einfach 'com.android.systemui.statusbar.policy.Clock' zu nicht durcheinander Ihre Codebasis, wenn Sie es bevorzugen – JRaymond

7

Haben Sie es versucht?

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

Edit:

Da Sie nicht setGravity für einen einfachen View, so etwas tun können,

können Sie einen RelativeLayout verwenden und eine Regel wie diese gesetzt ...

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

Ja. Die Methode setGravity ist für diese Ansicht nicht verfügbar. So kompiliert es nicht – user809486

+0

Uhr erweitert einen bestimmten Typ von Viewgroup? Oder nur eine generische Ansicht? Es kann sinnvoller sein, eine Viewgroup wie LinearLayout zu erweitern. – ootinii

+0

@ user809486 Ich habe meine Antwort bearbeitet bitte überprüfen Sie es ... –