2012-03-13 13 views
12

मैं एन/आर दोनों का समर्थन करने के लिए एक एंड्रॉइड ऐप विकसित कर रहा हूं। लेकिन मुझे एक समस्या का सामना करना पड़ा कि यदि उपयोगकर्ता एन से आर में बदलता है तो उपयोगकर्ता इंटरफ़ेस के संरेखण को "बाएं से दाएं" से "दाएं से बाएं" तक बदलना चाहिए।अंग्रेजी और अरबी "लेआउट संरेखण" का समर्थन करने के लिए एक एंड्रॉइड ऐप विकसित करें

उदाहरण: (TextView) (EditText) इस एन

में है लेकिन Ar में यह होना चाहिए: (EditText) (TextView)

क्या यह दो अलग-अलग लेआउट या दो अलग-अलग संस्करणों के बिना ऐसा करने का कोई तरीका है?

+0

अपने प्रश्न के उत्तर के रूप में स्वीकार करने वाले समाधान के बगल में स्थित चेक-चिह्न पर क्लिक करना न भूलें। –

उत्तर

12

यह दो लेआउट के साथ क्यों नहीं किया जा सकता है (आपने कभी नहीं कहा कि यह क्यों योग्य नहीं है)? जैसा कि एंड्रॉइड डेवलपर्स प्रलेखन

किसी एप्लिकेशन को स्थानीयकृत करने का एक बड़ा हिस्सा वैकल्पिक भाषाओं के लिए वैकल्पिक टेक्स्ट प्रदान कर रहा है। कुछ मामलों में आप वैकल्पिक ग्राफिक्स, ध्वनियां, लेआउट, और अन्य लोकेल-विशिष्ट संसाधन भी प्रदान करेंगे।

एक एप्लिकेशन विभिन्न राइटिफायरों के साथ कई res // निर्देशिका, प्रत्येक निर्दिष्ट कर सकता है। अलग-अलग लोकेल के लिए वैकल्पिक संसाधन बनाने के लिए, आप एक योग्यता का उपयोग करते हैं जो एक भाषा या भाषा-क्षेत्र संयोजन निर्दिष्ट करता है।

रेफरी: http://developer.android.com/guide/topics/resources/localization.html

तो अपने मामले में बनाने res/layout-ar तो इस फ़ोल्डर में अपने मौजूदा लेआउट कॉपी और फिर बस उन्हें दौर स्वैप। सरल, सर्वोत्तम प्रथाओं का पालन करता है और करना आसान है। इससे अधिक कोड लिखने के बिना आगे कोई भी स्थानीयकरण परिवर्तन आसान हो जाता है।

यदि आप कोड लिखना चाहते हैं तो आपको डिवाइस की डिफ़ॉल्ट भाषा खोजने की आवश्यकता होगी और उसके बाद दृश्यों को स्वैप करें। आप द्वारा भाषा प्राप्त कर सकते हैं: Get the current language in device

एक अंतिम निजी नोट पर::

Locale.getDefault().getDisplayLanguage(); 

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

+0

+1। साथ ही, यदि आप एक ही लेआउट के कई संस्करणों को बनाए रखने की कोशिश करने के बारे में चिंतित हैं, तो इसमें लेआउट शोध करने पर विचार करें: http://developer.android.com/resources/articles/layout-tricks-merge.html –

+0

@ जैकोबुड कुल समझ बोलता है (थोड़ा परेशान है कि मैं इसके बारे में भूल गया) - अच्छी तरह से खेला सर! –

+1

डुप्लिकेट में लेआउट की एक पूरी परियोजना को बनाए रखना एक दुःस्वप्न है! मेरे छोटे ऐप में से एक में भी मैं 20-30 लेआउट फाइलों का उपयोग कर रहा हूं। डुप्लिकेट लेआउट का उपयोग करके प्रत्येक बग या कार्यात्मक अद्यतन के लिए मुझे जो काम करना है, उसे दोगुना करना - यह सबसे अच्छा विकल्प हो सकता है लेकिन यह निश्चित रूप से अच्छा नहीं है। – Graeme

-3

क्यों टेक्स्टव्यू को संपादन टेक्स्ट के ऊपर न बनाएं?

+0

डुप्लीकेट होने से बचने के लिए अपने लेआउट को बाएं/दाएं स्वतंत्र होने के लिए जहां संभव हो सकता है - यह एक बहुत ही उचित उत्तर की तरह लगता है। प्रति लोकेल विभिन्न लेआउट के लिए – Graeme

0

मैं (फॉर्म घटकों जैसे CheckBox, EditText और Spinners के लिए) कस्टम LabeledView घटकों का एक सेट बनाने के द्वारा इस से बाहर आतंक से कुछ लेने के लिए कोशिश की है। ये विचार (जैसे LabledEditText) एक क्षेत्र-विशिष्ट लेआउट को बढ़ाता है और एक मुखौटा (EditText इस मामले में) के रूप में कार्य करने के लिए न्यूनतम कॉल का उपयोग करता है।

res/layout/component_labeled_view.xml - [TextView][EditText] 
res/layout-ar/component_labeled_view.xml - [EditText][TextView] 

View वर्ग ही शामिल हैं:

public LabeledEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater inflator = LayoutInflater.from(context); 

    mContainer  = inflator.inflate(R.layout.component_labeled_edittext, null);  
    mValueView  = (EditText) mContainer.findViewById(R.id.editText); 
    mLabelTextView = (TextView) mContainer.findViewById(R.id.textView); 

    align(attrs); 
} 

public Editable getText() { 
    return ((EditText)mValueView).getText(); 
} 

public void setText(String text) { 
    ((EditText)mValueView).setText(text); 
} 

public void addTextChangedListener(TextWatcher watcher) { 
    ((EditText)mValueView).addTextChangedListener(watcher); 
} 

यह कम से कम किसी भी दोहराव में कटौती करना चाहिए जैसा कि आप अब एक TextView और EditText कॉम्बो से LabeledEditText दृश्य संदर्भ के लिए नहीं बल्कि सक्षम होना चाहिए।

मेरी कार्यान्वयन में जो मैं पूरी तरह से नहीं दिखाया मैं एक कदम आगे चला गया और एक सार LabeledView वर्ग जो कुछ कस्टम मुझे दोनों लेबल और विशिष्ट स्थितियों में मूल्य अनुकूलित करने के लिए अनुमति देता है विशेषताओं का उपयोग करता बना लिया है (देखें के align(attrs); लाइन कोड)। इस पर निर्भर करते हुए कि आपका ऐप कितना बड़ा है, आप कुछ ऐसा करने की कोशिश कर सकते हैं?

0

एंड्रॉइड 4.2 ने "दाएं से बाएं" लेआउट के लिए मूल समर्थन प्रस्तुत किया। AndroidManifest में एंड्रॉइड सेट करें: एप्लिकेशन स्तर पर समर्थन आरटीएल = "सत्य" और लेआउट गुणों में बाएं/दाएं की बजाय प्रारंभ/अंत गुणों का उपयोग करें। विस्तृत स्पष्टीकरण वाला वीडियो यहां है: https://youtu.be/plW1qSGDSzs

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