2013-08-02 15 views
11

मैं टेक्स्ट की दिशा के आधार पर गतिशील रूप से यूआई बदलने की व्यवहार्यता के बारे में कुछ शोध कर रहा हूं। हालांकि Google आरटीएल भाषाओं का समर्थन कर रहा है (रेफरी: Native RTL support in Android 4.2) लेकिन इसमें ऐसी स्थिति शामिल नहीं है जिसमें आवेदन एलटीआर और आरटीएल सामग्री का मिश्रण हो।एंड्रॉइड में टेक्स्ट दिशा कैसे प्राप्त करें और दिशा के अनुसार गतिशील रूप से लेआउट बदलें?

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

निम्नलिखित छवि मेरे परीक्षण ऐप के वर्तमान डिज़ाइन को दिखाती है। सूची फेसबुक (मेरे दोस्तों की सूची) से आता है और इसमें अंग्रेजी और फारसी नाम शामिल हैं।

enter image description here

मेरे समाधान अनुकूलक में दो लेआउट (लीटर के लिए और एक RTL के लिए) होने और हर एक नाम की दिशा के आधार बताए है।

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

      if(position % 2 == 0) 
       convertView = myInflater.inflate(R.layout.list_add_friends_row, null); 
      else 
       convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null); 

      holder = new ViewHolder(); 

      holder.llSection = (LinearLayout) convertView.findViewById(R.id.section); 
      holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName); 
      holder.ivPicture = (ImageView) convertView.findViewById(R.id.ivPicture); 
      holder.btnAdd = (Button) convertView.findViewById(R.id.btnAdd); 

      convertView.setTag(holder); 



     holder.btnAdd.setTag(position); 
     holder.tvUserName.setText(userList.get(position).getName()); 
     imageDownloader.displayImage(holder.ivPicture, userList.get(position).getPhotoUrl()); 

     ... 

     return convertView; 
    } 

और परिणाम है::

enter image description here

मैं के आधार पर पंक्तियों नजर आता है, तो पंक्ति सम या विषम है तो, मैं कोड के निम्नलिखित लाइनों लिखा था। अब, मेरा सवाल है कि नाम के आधार पर यूआई को मिरर कैसे करें। मुझे लगता है कि मुझे if(position % 2 == 0) से if(isNameLTR(FIRST_CHAR_OF_NAME)) जैसे कुछ क्लॉज की स्थिति बदलनी चाहिए। मुझे नहीं पता कि इस विधि को कैसे कार्यान्वित किया जाए।

मुझे कैसे पता चलेगा कि एलटीआर ओटी आरटीएल है? (मुझे लगता है कि एंड्रॉइड जानता है कि शब्द का पहला अक्षर आरटीएल या एलटीआर है, यही कारण है कि जब टेक्स्ट व्यू की चौड़ाई मिलान होती है तो यह वर्ण सही होता है यदि चरित्र आरएलटी है और यदि चरित्र एलटीआर है तो छोड़ दिया जाता है)।

कोई भी सुझाव या टिप्पणियों की सराहना की जाएगी। धन्यवाद

उत्तर

22

समाधान, आसान था कि मैं सोच रहा था जावा

लिए :) धन्यवाद Bidi वर्ग वहाँ है। इस वर्ग में getBaseLevel() method है जो 0 देता है यदि आपका टेक्स्ट बाएं से दाएं अन्यथा है (यदि दाएं से बाएं)।

तो, यह मेरे कोड है:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); 
     if(bidi.getBaseLevel() == 0) 
      convertView = myInflater.inflate(R.layout.list_add_friends_row, null); 
     else 
      convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null); 

... 

और परिणाम है:

enter image description here

=============

अद्यतन:

एक और तरीका है, baseIsLeftToRight() जो कि कथन में इस्तेमाल किया जा सकता है बेहतर हो सकता है। परिणाम उपरोक्त के समान था।

Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); 
if(bidi.baseIsLeftToRight()) 
       convertView = myInflater.inflate(R.layout.list_add_friends_row, null); 
      else 
       convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null); 
0

gravity साथ उपयोग textAlignment पाठ एक TextView में है, तो सभी ग्रंथों सही या वाम

android:gravity="right" 
android:textAlignment="gravity" 
0

प्राप्त करने के लिए, तो तुम सब करने की है

android:textDirection="anyRtl" 
आरटीएल को मजबूर करने के लिए

। अपनी आवश्यकताओं के लिए अन्य विकल्प देखें।

ऐसे मामले हो सकते हैं जब TextView में मिश्रित भाषा पाठ नहीं दिखाना चाहिए। उदाहरण के लिए, पाठ को जीमेल या व्हाट्सएप में Intent शेयर में पारित किया जा सकता है और इसी तरह।

प्रलेखन, ये हैं में उद्धृत के रूप में ...

उपयोगिता वर्ग: इस तरह के मामलों में, आपको निम्न वर्गों का एक संयोजन का उपयोग करना चाहिए [es] बिना किसी घुमाव के संभावित संभावित दिशा-निर्देश संदर्भ में प्रदर्शन के लिए पाठ स्वरूपण के लिए। संदर्भ की दिशात्मकता फॉर्मेटर निर्माण पर सेट की गई है और पाठ की दिशात्मकता या तो ज्ञात या अनुमानित होने पर पारित की जा सकती है।

उदाहरण के लिए, यदि आप एक String की अंग्रेजी & अरबी एक संयोजन है कि है कहते हैं, और आप पाठ की जरूरत होने की

  • सही-से-बाएँ (RTL)।
  • हमेशा दाएं संरेखित, भले ही वाक्य अंग्रेजी के साथ शुरू होता है।
  • अंग्रेजी & सही अनुक्रम में और बिना किसी झुकाव के अरबी शब्द।

    String mixedLanguageText = ... // mixed-language text 
    
    if(BidiFormatter.getInstance().isRtlContext()){ 
        Locale rtlLocale = ... // RTL locale 
        mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR); 
    } 
    

    यह RTL में स्ट्रिंग बदलने और बाईं ओर संरेखित, अगर एक भी RTL भाषा के चरित्र स्ट्रिंग में था होगा:

तो आप इस इस प्रकार unicodeWrap() पद्धति का उपयोग करके प्राप्त कर सकते थे , और एलटीआर को अन्यथा गिरावट। यदि आप स्ट्रिंग को आरटीएल होना चाहते हैं, भले ही यह पूरी तरह से हो, अंग्रेजी (एक एलटीआर भाषा) कहें, तो आप के बजाय TextDirectionHeuristics.RTL का उपयोग कर सकते हैं।

TextView की अनुपस्थिति में मिश्रित-दिशा पाठ को संभालने का यह सही तरीका है। दिलचस्प बात यह है प्रलेखन राज्यों के रूप में,

भी ध्यान दें कि इन दिशा heuristics ऐसे TEXT_DIRECTION_RTL रूप setTextDirection() के लिए View वर्ग में प्रदान की स्थिरांक की एक ही प्रकार के अनुरूप है,।

आगे संदर्भ:

1.Write text file mix between arabic and english

2.Unicode Bidirectional Algorithm

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