2013-06-16 43 views
6

Tôi đang tạo tiện ích con cho ứng dụng Android của mình sẽ có một số nút trên đó. Dựa trên kích thước của tiện ích, tôi muốn số lượng nút trên tiện ích phát triển và thu nhỏ. Đây là những gì nó hiện trông giống như trong một cái nhìn 4x1: 4x1 widgetThay đổi kích thước tiện ích con của Android

Và khi bạn thu nhỏ nó xuống để 3x1: 3x1

Liệu có cách nào để tự động ẩn nút thứ 4 trong giao diện 3x1 nên khác 3 nút không được squished? Tương tự như vậy sẽ cho một 2x1 hoặc 1x1. Bất kỳ đầu vào về điều này sẽ được đánh giá rất nhiều!

Cảm ơn!

+1

Bạn thiết kế quy tắc người đàn ông! – Piovezan

+1

Haha cảm ơn bạn! – BarryBostwick

Trả lời

0

Bạn có thể thử nghe cuộc gọi lại onAppWidgetOptionsChanged: sẽ kích hoạt bất cứ khi nào kích thước bố cục thay đổi. Tuy nhiên, có thực sự không có cách nào tôi đã nhìn thấy (ngay bây giờ) để xác định số tiền thực tế của bất động sản màn hình widget của bạn đang chiếm, do đó, không có cách nào tốt để thay đổi tầm nhìn nút dựa trên kích thước.

4

Từ phiên bản 4.1 (api level 16) có hàm getAppWidgetOptions() trả về một gói với một số tham số định cỡ. Xem here. Có lẽ bạn có thể sử dụng nó cho những gì bạn cần, nhưng afaik không có tùy chọn tương tự cho các phiên bản dưới 4.1.

8

Như đã được đề xuất, bạn không có cách nào khác ngoài việc triển khai onAppWidgetOptionsChanged trong nhà cung cấp tiện ích con của mình - Cấp API < 16 người dùng sẽ không có tính năng này.

Để ẩn các nút khi tiện ích co lại, tiện ích của bạn cần hoạt động tương tự như tiện ích thời tiết được đưa ra làm ví dụ trong trang web Thiết kế Android, dưới mẫu "Widgets" (appwidgets thực sự). Bạn hiển thị ít nút hơn khi tiện ích thu nhỏ lại, nhiều nút hơn khi nút này phát triển, đặt mức hiển thị của nút.

enter image description here

Trong onAppWidgetOptionsChanged, sử dụng các giá trị được đưa ra bởi Bundle newOptions, bạn phải phát hiện sự thay đổi trong chiều rộng và chiều cao và thiết xô kích thước như khuyên trong các tài liệu (từ trang Thiết kế giống nhau):

Thực tế, khi người dùng đổi kích thước tiện ích con, hệ thống sẽ phản hồi với phạm vi kích thước dp trong đó tiện ích của bạn có thể tự vẽ lại. Lập kế hoạch chiến lược thay đổi kích thước tiện ích mở rộng của bạn trên "nhóm kích thước" thay vì biến số lưới sẽ cho bạn kết quả đáng tin cậy nhất.

Điều thực sự thách thức là cách xác định các nhóm đó. Gói NewOptions có các giá trị min_width, min_height, max_width và max_height khác nhau đáng kể giữa các thiết bị, mật độ màn hình, trình khởi chạy, v.v. Thật không may là nhóm Android đã không cho chúng tôi biết cách thực hiện điều này và có một vài mẫu mã của onAppWidgetOptionsChanged trên web, hầu hết trong số họ rất đơn giản.

8

Như họ đã nói. Bạn có thể sử dụng onAppWidgetOptionsChanged

Vì vậy, đề xuất của tôi là để

1) Hãy bố trí khác nhau. Với 3 và 4 nút.

2) Thay đổi cơ sở bố trí trên số cột phụ tùng.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
@Override 
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { 

    // See the dimensions and 
    Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); 

    // Get min width and height. 
    int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); 
    int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); 

    // Obtain appropriate widget and update it. 
    appWidgetManager.updateAppWidget(appWidgetId, getRemoteViews(context, minWidth, minHeight)); 
    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); 
} 

/** 
* Determine appropriate view based on row or column provided. 
* 
* @param minWidth 
* @param minHeight 
* @return 
*/ 
private RemoteViews getRemoteViews(Context context, int minWidth, int minHeight) { 
    // First find out rows and columns based on width provided. 
    int rows = getCellsForSize(minHeight); 
    int columns = getCellsForSize(minWidth); 
    // Now you changing layout base on you column count 
    // In this code from 1 column to 4 
    // you can make code for more columns on your own. 
    switch (column) { 
     case 1: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_1column); 
     case 2: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_2column); 
     case 3: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_3column); 
     case 4: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column); 
     default: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column); 
    } 
} 

/** 
* Returns number of cells needed for given size of the widget. 
* 
* @param size Widget size in dp. 
* @return Size in number of cells. 
*/ 
private static int getCellsForSize(int size) { 
    int n = 2; 
    while (70 * n - 30 < size) { 
     ++n; 
    } 
    return n - 1; 
} 
+1

Đây phải là câu trả lời được chấp nhận –

Các vấn đề liên quan