2012-04-27 20 views
15

Im làm việc trên View qua Mã nguồn Android. Tôi đã tự hỏi như thế nào chúng ta có thể thiết lập nhiều trọng lực, đến một tùy chỉnh ViewĐặt trọng lực của Chế độ xem theo Lập trình

Đây là 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" 
     /> 

Như bạn thấy, lực hấp dẫn mặc định là center_vertical | trái, do đó, mã Java của tôi nên được một cái gì đó giống như

này
View clock = mStatusBarView.findViewById(R.id.clock); 

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

setPhương pháp hấp dẫn không hoạt động trên View. Vì vậy, có một thay thế của thiết lập lực hấp dẫn mà không làm mất chiều rộng và chiều cao theo mặc định ?.

Xin cảm ơn trước.

+0

bạn có thực sự muốn lực hấp dẫn hay bạn muốn layout_gravity? – JRaymond

+0

android: gravity = "center_vertical | left", đây là thuộc tính tôi muốn thay đổi. Vì vậy, tôi đoán chỉ là trọng lực? Liệu tôi có sai? – user809486

+0

không, tôi hiểu, bây giờ - nhưng Agarwal là đúng: sử dụng các loại thực tế, không xem, vì loại thực tế có khả năng sẽ đáp ứng setGravity – JRaymond

Trả lời

31

Vì com.android.systemui.statusbar.policy.Clock mở rộng TextView, hãy đưa nó vào một TextView và đặt trọng lực.

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

Ref: Source code

+0

Bạn có thể xem tại đây https://github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java và tại đây https: //github.com/AOKP/frameworks_base/blob/ics/packages/SystemUI/res/layout/status_bar.xml Có vẻ như là cách tốt nhất. Tôi nghĩ rằng cách của bạn không hoạt động vì là một linearLayout. – user809486

+0

Tôi đã kết thúc bằng cách chuyển mã từ nguồn AOKP, tuy nhiên câu trả lời của bạn chính xác hơn.Cảm ơn. – 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); 

thử mã trên và xóa Xem đồng hồ = mStatusBarView.findViewById (R.id.clock);

+0

Hoặc chỉ cần nhập 'com.android.systemui.statusbar.policy.Clock' để không lộn xộn codebase của bạn, nếu bạn thích – JRaymond

7

Bạn đã thử chưa?

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

Edit:

Vì bạn không thể sử dụng setGravity cho một đồng bằng View, làm một cái gì đó như thế này,

Bạn có thể sử dụng một RelativeLayout và thiết lập một quy tắc như vậy ...

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

Có. Phương thức setGravity không khả dụng cho Chế độ xem này. Vì vậy, nó sẽ không biên dịch – user809486

+0

Đồng hồ có mở rộng một loại nhóm xem nhất định không? Hoặc chỉ là một cái nhìn chung? Nó có thể có ý nghĩa hơn để mở rộng một nhóm xem, chẳng hạn như LinearLayout. – ootinii

+0

@ user809486 Tôi đã chỉnh sửa câu trả lời của mình, vui lòng kiểm tra ... –