2012-09-02 23 views
6

मैंने थोड़ी देर के लिए एंड्रॉइड प्रोग्राम किया है, लेकिन यह वास्तव में मुझे पहेली करता है।एपविजेट में टेक्स्टव्यू में विजेट आकार के आधार पर पाठ आकार का आकार कैसे बदलें?

तो मेरे पास एक टेक्स्टव्यू के साथ एक सरल अपवाद है। यदि उपयोगकर्ता ऐप का आकार बदलता है तो पाठ को बड़ा बनाने के लिए, यदि मैं विजेट का आकार बदलता हूं तो मैं बस उस टेक्स्टव्यू के अंदर टेक्स्ट फ़ॉन्ट आकार को ऊपर/नीचे स्केल करना चाहता हूं। मैं कई समाधान की कोशिश की है, लेकिन सब कुछ विफल रहता है:

  1. आप फ़ॉन्ट आकार के लिए "sp" (बढ़ाया पिक्सल) इकाई का उपयोग कर - इस पाठ पैमाने पर नहीं है जब विजेट आकार परिवर्तन (मैं भी रूप में उम्मीद नहीं थी कुंआ!)।

  2. टेक्स्ट व्यू को अपने आप के साथ विस्तारित करना और आकार बदलना विधि पर ओवरराइड करना। लेकिन आप विजेट में मूल यूआई कक्षाओं के वंशज नहीं हो सकते हैं (दस्तावेज़ीकरण यह भी बताता है)।

चूंकि मौजूदा ऐपविड्ज आकार को पाने के लिए कोई तरीका नहीं है, इसलिए मैं बस यहां फंस गया हूं।

हां, मुझे पता है कि एक समाधान विजेट के विभिन्न संस्करणों जैसे 1x4 और 2x4 आदि बनाना है, लेकिन निश्चित रूप से एक और तरीका है?

किसी भी विचार का स्वागत है?

+0

बाद के पाठकों को एक साइड नोट के रूप में, मैं कह सकता हूं कि एपीआई 16+ से करना संभव है। एक कॉलबैक विधि है जिसे आप विजेट में ओवरराइड कर सकते हैं: onAppWidgetOptionsChanged और इस विधि से आप अधिकतम चौड़ाई और ऊंचाई (नीचे कुछ बिंदु के रूप में) प्राप्त कर सकते हैं। लेकिन एपीआई 16 के नीचे आकार बदलने के लिए वास्तव में आसान नहीं है। – zaifrun

उत्तर

3

पैरेंट आकार के आधार पर टेक्स्टव्यू के पाठ को स्वचालित रूप से स्केल करना संभव नहीं है। टेक्स्टव्यू की onDraw विधि को ओवरराइड करना और मैन्युअल रूप से स्केलिंग को कार्यान्वित करना होगा।

एपविड्ज के लिए: आप एक आकार बदलने योग्य ऐपविड्ज के वर्तमान आकार को पुनः प्राप्त नहीं कर सकते क्योंकि उनका उपयोग ListView और GridView कंटेनर के साथ उपयोग के लिए किया गया है। ये कंटेनर स्वचालित रूप से सामग्री के स्केलिंग और रिक्ति का प्रबंधन करेंगे और यदि सामग्री एपविजेट के वर्तमान आकार में फिट नहीं हो सकती है तो खुद को स्क्रॉल करने योग्य बना देगा।

आप एक ListView या एक GridView मेरे लिए यह लगता है सबसे अच्छा तरीका है करने के लिए "पैमाने" एक appwidget के घटकों विधि आप पहले ही उल्लेख किया है का उपयोग नहीं कर रहे हैं: उपयोग विभिन्न गैर resizeable appwidgets।

+0

जैसा कि मैंने कहा था, टेक्स्टव्यू को विस्तारित करने और ओवरराइड करने के साथ कामकाज दस्तावेज के रूप में कार्य नहीं करता है क्योंकि दस्तावेज भी बताता है। हो सकता है कि मैं TextView को ग्रिड व्यू के अंदर रख सकता हूं और यह काम करेगा? – zaifrun

+0

एक पंक्ति के साथ 'ग्रिड व्यू' और टेक्स्टव्यू के साथ एक कॉलम fill_parent पर सेट किया जा सकता है।यदि ऐसा नहीं होता है तो आपको शायद विभिन्न आकार के गैर-आकार बदलने योग्य ऐपविड्ज का सहारा लेना चाहिए। –

+0

मुझे काम करने के लिए ग्रिडव्यू के साथ दृष्टिकोण भी नहीं मिला। मुझे लगता है कि एकमात्र तरीका अलग-अलग गैर-आकार बदलने योग्य आकारों के साथ कई एपविड्ज होना है (ऐसा लगता है कि यह दूसरों के साथ भी व्यवहार करता है)। खैर, उम्मीद है कि कम से कम दूसरों को मेरे प्रश्न से फायदा हो सकता है और समय बचा सकता है! – zaifrun

3

अधिकतम चौड़ाई (विजेट की ऊंचाई के समान तरीका) प्राप्त करने के लिए आप AppWidgetManager.getAppWidgetOptions(OPTION_APPWIDGET_MAX_WIDTH) पर कॉल कर सकते हैं और तदनुसार टेक्स्ट आकार समायोजित कर सकते हैं। सीमा: इस विधि एपीआई स्तर से उपलब्ध है 16

+1

यह ठीक काम करता है, हालांकि विभिन्न लॉन्चर्स थोड़ा अलग मूल्य (डीपी बनाम पीएक्स) इत्यादि पास करेंगे, इसलिए इसे सही तरीके से प्राप्त करना कुछ हद तक गन्दा है। –

1

यह आदिम तरीका है, लेकिन यह काम करता है:

AppWidgetManager manager = AppWidgetManager.getInstance(this); 
ComponentName thisWidget = new ComponentName(this, AppWidget.class); 
int[] widgetId = manager.getAppWidgetIds(thisWidget); 
Bundle options; 
options = manager.getAppWidgetOptions(widgetIds[1]); 
int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); 
int maxWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH); 
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); 
int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); 
int maxtextLen = (maxWidth/currentTextSize) * (maxHeight/currentTextSize); 

Boolean isFit = maxtextLen > textInWidgetTextView.length(); 
1

https://stackoverflow.com/a/7875656/6364860 से-स्निप यह ऊपर जवाब और एक सुंदर कोड के संयोजन, मैं इसे इस तरह से काम कर रहा है:

* नोट मेरे पास पाठ के साथ एक गोलाकार बटन था, इसलिए मुझे केवल छोटे आयाम की आवश्यकता थी।

@Override 
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions){ 

    super.onAppWidgetOptionsChanged(context,appWidgetManager,appWidgetId,newOptions); 

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     int maxWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH); 
     int maxHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); 

     int size = Math.min(maxHeight,maxWidth); 
     int pxSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,size,context.getResources().getDisplayMetrics()); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_button); 
     float newSize = refitText(context.getString(R.string.button_text),pxSize); 

     remoteViews.setTextViewTextSize(R.id.widget_text, TypedValue.COMPLEX_UNIT_PX,newSize); 

     appWidgetManager.updateAppWidget(appWidgetId,remoteViews); 
    } 

} 

private float refitText(String text, int textWidth) 
{ 
    if (textWidth <= 0) 
     return 0; 

    float hi = 100; 
    float lo = 2; 
    final float threshold = 0.5f; // How close we have to be 

    Paint testPaint = new Paint(); 

    while((hi - lo) > threshold) { 
     float size = (hi+lo)/2; 
     testPaint.setTextSize(size); 
     if(testPaint.measureText(text) >= textWidth) 
      hi = size; // too big 
     else 
      lo = size; // too small 
    } 
    // Use lo so that we undershoot rather than overshoot 
    return lo; 
} 
संबंधित मुद्दे