2012-03-08 36 views
25

पर दो अलग-अलग फ़ॉन्ट शैलियों को लागू करें, मैं एक टेक्स्ट व्यू में किसी टेक्स्ट में दो अलग-अलग फ़ॉन्ट शैलियों को लागू करना चाहता हूं।टेक्स्ट व्यू

मेरा मामला Android - two sentences, two styles, one TextView जैसा ही है। केवल अंतर यह है कि मैं पूरे पाठ पर कस्टम फ़ॉन्ट सेट करना चाहता हूं। मैंने अपनी परियोजना में एक संपत्ति के रूप में हेल्वैटिका फ़ॉन्ट को शामिल किया है और पाठ के पहले भाग के साथ टेक्स्टव्यू में उस फ़ॉन्ट को लागू करना चाहते हैं, हेल्वैटिका बोल्ड और शेष भाग हेल्वैटिका नॉर्मल होगा। कोई सुझाव यह कैसे किया जा सकता है?

पाठ को निम्नलिखित प्रारूप में आवश्यक है। विभिन्न शैलियों और एकल पाठ्यदृश्य के साथ कस्टम पाठ।

enter image description here

+0

, इसलिए आप विभिन्न fontstyles साथ दो अलग अलग TextView उपयोग नहीं कर सकते करने के लिए सेट कर रहे हैं। –

+0

@ सेंथिलएमजी आप इस प्रश्न में संदर्भ लिंक पर इसका कारण देख सकते हैं।यह टेक्स्ट को प्रारूपित नहीं करेगा क्योंकि इसकी आवश्यकता – rizzz86

+0

है, मुझे लगता है कि रीजिक्स का उपयोग करके पूर्ण स्ट्रिंग को दो में विभाजित करने का अनुमान है: और विभिन्न टेक्स्टव्यू पर सेट करें उदाहरण के लिए: स्ट्रिंग टेक्स्ट = एएएए: बीबीबीबीबी, स्ट्रिंग [] splitText = text.split (":"); tv1.setText (splitText [0]); tv2.setText (splitText [1]); –

उत्तर

69

एक तरह से यह करने के लिए TypefaceSpan विस्तार करने के लिए है:

import android.graphics.Paint; 
import android.graphics.Typeface; 
import android.text.TextPaint; 
import android.text.style.TypefaceSpan; 

    public class CustomTypefaceSpan extends TypefaceSpan { 
     private final Typeface newType; 

     public CustomTypefaceSpan(String family, Typeface type) { 
      super(family); 
      newType = type; 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      applyCustomTypeFace(ds, newType); 
     } 

     @Override 
     public void updateMeasureState(TextPaint paint) { 
      applyCustomTypeFace(paint, newType); 
     } 

     private static void applyCustomTypeFace(Paint paint, Typeface tf) { 
      int oldStyle; 
      Typeface old = paint.getTypeface(); 
      if (old == null) { 
       oldStyle = 0; 
      } else { 
       oldStyle = old.getStyle(); 
      } 

      int fake = oldStyle & ~tf.getStyle(); 
      if ((fake & Typeface.BOLD) != 0) { 
       paint.setFakeBoldText(true); 
      } 

      if ((fake & Typeface.ITALIC) != 0) { 
       paint.setTextSkewX(-0.25f); 
      } 

      paint.setTypeface(tf); 
     } 
    } 

फिर जब आप दो अलग अलग टाइपफेस का उपयोग करना चाहते फोन:

String firstWord = "first "; 
String secondWord = "second"; 

// Create a new spannable with the two strings 
Spannable spannable = new SpannableString(firstWord+secondWord); 

// Set the custom typeface to span over a section of the spannable object 
spannable.setSpan(new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
spannable.setSpan(new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

// Set the text of a textView with the spannable object 
textView.setText(spannable); 
+0

उत्तर के लिए धन्यवाद लॉरेंस। मैं यह कोशिश कर रहा हूं और देखता हूं कि परिणाम क्या होगा। मुझे यह भी समझने की कोशिश करें कि आपके द्वारा प्रदान किए गए कोड स्निपेट में क्या हो रहा है)) – rizzz86

+0

कोई समस्या नहीं, मैंने विस्तारित टाइपफेसस्पैन के नाम से संबंधित कोड के दूसरे ब्लॉक में छोटा बदलाव किया है। कार्यान्वयन के मामले में, कस्टमटाइपफेसस्पैन जाने के लिए तैयार है, आपको इसे अपने प्रोजेक्ट में जोड़ने की आवश्यकता होगी। कोड का दूसरा ब्लॉक वह है जिसे आपको संपादित करने की आवश्यकता होगी। – Ljdawson

+2

लॉरेंस जो मेरे लिए काम करता है। यह मुद्दा छोटा प्रतीत होता है लेकिन समाधान थोड़ा जटिल है। वास्तव में मेरे समय को बचाने में मदद के लिए धन्यवाद। – rizzz86

-2

आप spanable पाठ लागू करने से पहले TextView पर एक कस्टम टाइपफेस सेट करने का प्रयास किया था?

Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf") 
TextView tv = (TextView) ctx.findViewById(id); 
tv.setTypeface(face); 

और फिर जुड़ा हुआ सवाल से के रूप में SpannableStringBuilder लागू होते हैं - मैं सिर्फ यह सोचते कर रहा हूँ कि अगर आपके ttf का समर्थन करता है 'सामान्य' और 'बोल्ड' यह तदनुसार प्रस्तुत करना होगा :)

+0

मैंने इस तरह से भी कोशिश की है। लेकिन यह लागू नहीं होता है। – rizzz86

0

आप एक कस्टम दृश्य बना सकते हैं और दो साथ अपने पाठ प्रस्तुत करना का उपयोग कर वस्तुओं पेंट canvas.drawText विधि

+0

मैं canvas.drawText को आजमाउंगा और जांच सकता हूं कि यह कैसे काम करता है – rizzz86

2

यह काम कर सकते हैं - अपने स्वयं के कस्टम TextView बना सकते हैं और फिर इसे से एक हिस्से पर एक StyleSpan का उपयोग करें:

public class CustomTextView extends TextView { 

    public CustomTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public void setTypeface(Typeface tf, int style) { 
     if (style == 1){ 
      //replace "HelveticaBOLD.otf" with the name of your bold font 
      tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf"); 
     }else{ 
      //replace "HelveticaNORMAL.otf" with the name of your normal font 
      tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf"); 
     } 
     super.setTypeface(tf, 0); 
    } 
} 

और तो आप की तरह कुछ कर सकते हैं:

int index1 = 0; //wherever bold should begin 
int index2 = 5; //wherever bold should end 

Spannable span = new SpannableString("some string"); 
span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

((CustomTextView)findViewById(R.id.yourTextView)).setText(span); 
+0

यह मेरे लिए काम नहीं करता है। वैसे भी जवाब के लिए धन्यवाद। – rizzz86

+0

बिल्कुल वही जो मैं खोज रहा था, धन्यवाद – Ash

2

यहाँ एक समाधान और अधिक सरल है, तो आप उपयोग कर सकते हैं एचटीएमएल एक ही TextView पर विभिन्न शैलियों को सेट करने के लिए।

// Styled label 
String styledText = "<big><b><font color='#333333'>title</font></b></big> <small><b><font color='#CC5490'>subtitle</font></b></small>"; 

// Apply the styled label on the TextView 
textView.setText(Html.fromHtml(styledText)); 

आप निम्न आयात की जरूरत:

उदाहरण के लिए

import android.text.Html; 
0

मैं इस दृष्टिकोण

class FooClass { 
    void Foo() { 
     textViewSetText(R.id.photo_title, "Title: ", photo.getTitle()); 
     textViewSetText(R.id.photo_tags, "Tags: ", photo.getTags()); 
     textViewSetText(R.id.photo_author, "Author: ", photo.getAuthor()); 
    } 

    private void textViewSetText(int resourceId, String prefix, String text) { 
     TextView textView = (TextView) findViewById(resourceId); 
     SpannableString styledText = new SpannableString(prefix); 
     styledText.setSpan(new StyleSpan(Typeface.BOLD), 0, prefix.length(), 0); 
     textView.setText(null); 
     textView.append(styledText); 
     textView.append(text); 
    } 
} 

का उपयोग आप देख सकते हैं "लेखक", "शीर्षक "और" टैग "बोल्ड

Screenshot http://image.prntscr.com/image/dd60bb4a335445c2adca8a4596d7fb32.png

संबंधित मुद्दे