2013-07-01 25 views

Trả lời

4

Tôi đã phát hiện ra rằng bạn có thể bắt RESIZE hành động trong chức năng onReceive.

if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) 

Bạn sẽ nhận được các giá trị sau từ getExtras của mục đích này() bó:

int appWidgetId = bundle.getInt("widgetId"); // bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 


int widgetSpanX = bundle.getInt("widgetspanx", 4); 
int widgetSpanY = bundle.getInt("widgetspany", 1); 

Bây giờ bạn có thể sử dụng những giá trị này để cập nhật các xem hoặc lưu trữ chúng trong một biến bản đồ số nguyên tĩnh để sử dụng trong ngày cập nhật tiếp theo.

+0

"hoặc lưu trữ chúng trong biến số nguyên bản đồ tĩnh" - điều này sẽ không đáng tin cậy vì quá trình của bạn có thể bị chấm dứt giữa chương trình phát sóng 'com.sec.android.widgetapp.APPWIDGET_RESIZE' và bất kỳ' onUpdate nào tiếp theo() 'gọi. Bây giờ, nó có thể làm việc ra rằng mã sửa đổi của Samsung sẽ kích hoạt một 'onUpdate()' rất ngắn sau khi 'com.sec.android.widgetapp.APPWIDGET_RESIZE', trong trường hợp các thành viên dữ liệu tĩnh có thể làm việc trong thực tế. – CommonsWare

+0

@CommonsWare cảm ơn bạn, bạn có thể đúng. Nó không kích hoạt onUpdate tự động, vì vậy tôi phát sóng một bản cập nhật nếu kích thước mới không giống với kích thước mà tôi đã lưu trữ trong biến tĩnh. Đối với biến tĩnh: Ứng dụng được tự động bắt đầu gọi onReceive, vì vậy nó sẽ luôn đặt biến tĩnh đó. Nếu nó bị giết tại thời điểm đó, nó có thể gây ra bởi một vụ tai nạn và nó không nên sụp đổ anyways .. nếu không chúng tôi có thể không cập nhật các widget. Tui bỏ lỡ điều gì vậy? : | Nhân tiện, chúng tôi luôn có thể cập nhật trực tiếp từ chức năng đánh lừa, nếu chúng ta không quan tâm đến kích thước của nó thì có giống nhau hay không. – frankish

10

Tôi thêm vào câu trả lời Frankish với cách tôi xử lý nhận phát sóng này:

@Override 
public void onReceive(Context context, Intent intent) { 
    // Handle TouchWiz 
    if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) { 
     handleTouchWiz(context, intent); 
    } 
    super.onReceive(context, intent); 
} 

private void handleTouchWiz(Context context, Intent intent) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

    int appWidgetId = intent.getIntExtra("widgetId", 0); 
    int widgetSpanX = intent.getIntExtra("widgetspanx", 0); 
    int widgetSpanY = intent.getIntExtra("widgetspany", 0); 

    if(appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) { 
     Bundle newOptions = new Bundle(); 
     // We have to convert these numbers for future use 
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74); 
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74); 

     onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); 
    } 
} 

Bạn có thể cần phải thay đổi cách bạn xử lý bó rằng nếu bạn đang sử dụng MAX_HEIGHT hoặc MAX_WIDTH mà tôi không.

+0

vì bạn là người xử lý hành động, bạn có nên tránh gọi "super.onReceive" trong trường hợp này không? –

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