2013-01-11 12 views
24

एंड्रॉयड डिजाइन पैटर्न मार्गदर्शक कहता विजेट की सामग्री और लेआउट गतिशील आकार उपयोगकर्ता आकार आपरेशन यहाँ के माध्यम से परिभाषित करने के लिए समायोजित किया जा सकता: Design guide for widgetsगतिशील रूप से आकार बदलने के लिए उपयोगकर्ता द्वारा आकार के आकार के लिए विजेट की सामग्री और लेआउट समायोजित करना। एंड्रॉयड

उदाहरण डिजाइन गाइड में प्रदान की: Example image provided in the design guide.

लेकिन मैं नहीं दिख रहा है दस्तावेज़ों में कुछ भी यह कैसे पूरा किया जाए। आकार बदलने के अनुसार हम लेआउट कैसे बदल सकते हैं? दृष्टिकोण के बारे में किसी भी विचार की सराहना की जाएगी।

+0

कोई इनपुट किसी को भी? – Gogu

+1

ऐसा लगता है कि यह एक जेलीबीन + फीचर है, क्योंकि 'AppWidgetProvider # onAppWidgetOptionsChanged() 'विधि। [वन] (http://code4reference.com/2012/07/android-homescreen-widget-with-alarmmanager/) उदाहरण मैंने इसे कार्यान्वित किया। –

+1

क्या विजेट के आयामों को जानने का कोई तरीका है ताकि हम एक उचित दृश्य प्रस्तुत कर सकें? जेलीबीन + भी ठीक है। – Gogu

उत्तर

22

ए - सी के लिए धन्यवाद, यह जेलीबीन और उपरोक्त उपकरणों के लिए संभव है और इसे लागू करने में आसान है। नीचे का उपयोग कर नमूना कोड onAppWidgetOptionsChanged विधि

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

    Log.d(DEBUG_TAG, "Changed dimensions"); 

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

    if (columns == 4) { 
     // Get 4 column widget remote view and return 
    } else { 
        // Get appropriate remote view. 
     return new RemoteViews(context.getPackageName(), 
       R.layout.quick_add_widget_3_1); 
    } 
} 

/** 
* 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; 
} 
+0

सबसे पहले, आपको केवल 4 कक्षों से ही सीमित नहीं होना चाहिए। इस तरह एक लूप का प्रयोग करें: http://pastebin.com/reexPt1m। दूसरा, आप स्क्रीन घनत्व को समायोजित करना भूल जाते हैं। तीसरा, इस बात की कोई गारंटी नहीं है कि विजेट का आकार 264 डीपी 4 कोशिकाओं को ले जाएगा। मेरे सोनी उपकरणों में से एक 264 डीपी 3 कोशिकाओं में फिट बैठता है। आपको डीपी में लेआउट चौड़ाई के साथ काम करना चाहिए और कोशिकाओं नहीं। – Pijusn

+0

@Pius ने कोशिकाओं को प्राप्त करने के लिए कोड अपडेट किया। धन्यवाद। सच केवल 4 कोशिकाओं के साथ सीमित नहीं होना चाहिए। हालांकि इस बात की कोई गारंटी नहीं है कि इसमें 4 सेल्स लगेंगे, यह आपके लेआउट को आधार देने का एक अच्छा अनुमान होगा। – Gogu

+0

बंडल विकल्प = appWidgetManager.getAppWidgetOptions (appWidgetId); लौटा हुआ बंडल नया विकल्प – zest

0

@Choletski @azendh

बदलते लेआउट के बाद कुछ क्लिक ईवेंट अब कहा जाता है नहीं कर रहे हैं

मैं समारोह बनाने के द्वारा इस समस्या का समाधान है उस सेटऑनक्लिकपेंडइन्टेंट को देखने पर, और फिर इसे वापस करें।

उदाहरण के लिए कोड की तरह

private RemoteViews getConfiguredView (RemoteViews remoteViews, Context context){ 

    Intent refreshIntent = new Intent(context, EarningsWidget.class); 
    refreshIntent.setAction(REFRESH_ACTION); 
    PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 3, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.refreshButton, toastPendingIntent); 
    return remoteViews; 
} 

है और की तुलना में समारोह कहा जाता है जहां करते हैं "उचित दूरदराज के दृश्य प्राप्त करें।"

return getConfiguredView(new RemoteViews(context.getPackageName(), R.layout.activity_widget), context); 
संबंधित मुद्दे