2012-03-17 13 views
28

मेरे पास एक लेआउट है जिसमें दो छवि दृश्य हैं। मैं चाहता हूं कि उनमें से एक चित्र में और दूसरा परिदृश्य में दिखाई दे। संसाधनों का उपयोग करके मैं इसे कैसे प्राप्त करूं? (मुझे पता है कि इसे प्रोग्रामेटिक रूप से कैसे सेट किया जाए लेकिन यह विशिष्ट उपयोग मुझे संसाधनों का उपयोग करके इसे प्राप्त करने की आवश्यकता है)।संसाधनों से दृश्य दृश्यता को नियंत्रित करना

... 
<!-- NOTE: 0 and 8 are VISIBLE and GONE respectively --> 
<integer name="visibile_in_portrait">0</integer> 
<integer name="visibile_in_landscape">8</integer> 
रेस में

/मूल्यों भूमि:

... 
<ImageView 
     android:id="@+id/image1" 
     android:visibility="@integer/visible_in_portrait" <<-- is this allowed? 
     ... 
/> 
<ImageView 
     android:id="@+id/image2" 
     android:visibility="@integer/visible_in_landscape" 
     ... 
/> 
में res/values ​​/ integers.xml

:

मैं की तरह

में रेस/लेआउट/may_layout.xml

कुछ करने की कोशिश की /integers.xml:

... 
<integer name="visibile_in_portrait">8</integer> 
<integer name="visibile_in_landscape">0</integer> 

बी अगर मैं छवियों को फुलाए जाने की कोशिश करते समय रनटाइम त्रुटि (बाध्य से बाहर सूचकांक) प्राप्त करता हूं। जब मैं एंड्रॉइड को हटाता हूं: दृश्यता बयान, प्रोग्राम चलता है लेकिन मैं दोनों छवियों को देखता हूं।

प्रश्न: एंड्रॉइड के लिए संसाधन के रूप में संसाधन का उपयोग करने का तरीका क्या है: दृश्यता विशेषता?

(यदि आपको आश्चर्य है कि इसे प्रोग्रामेटिक रूप से क्यों सेट करना मेरी मदद नहीं करेगा, तो उसे फ़ाइल यूरी बिटमैप्स के साथ ऐप विजेट्स के स्वचालित लैंडस्पेस/पोर्ट्रेट स्विच के साथ करना होगा)।

उत्तर

23

यह संभव होगा जब आप इस चाल का उपयोग करें, अपनी दृश्यता रेखा को शैली में जोड़ें और उस फ़ाइल के दो उदाहरणों को भूमि और सामान्य मोड में रखें।

मैं फ़ाइल styles.xml फ़ोल्डर values में नाम s1 के साथ एक शैली रखा, और उस में android:visibility=visible रखा, और फ़ोल्डर values-land में styles.xml में नाम s1 के साथ एक शैली रखा, और android:visibility=gone डाल में मतलब है।

भी फ़ाइल styles.xml में फ़ोल्डर values में एक शैली का नाम s2 साथ डाल दिया, और कहा कि में android:visibility=gone रखा, और styles.xml में फ़ोल्डर values-land में नाम s2 के साथ एक शैली रखा, और android:visibility=visible डाल दिया।

और फिर, s1 को पहले छविदृश्य और s2 पर दूसरे पर सेट करें।

प्रिय कैल्विन द्वारा दिए गए समाधान भी सही हैं, लेकिन जब आपके पास एक जटिल लेआउट होता है जो समय के दौरान बदल सकता है, तो एक लेआउट फ़ाइल बेहतर होगी, और बदलने की आवश्यकता कम होगी।

+0

धन्यवाद किहान, मैं इसे एक कोशिश और रिपोर्ट दूंगा। क्या यह दृष्टिकोण इस प्रश्न के साथ भी मदद करेगा? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview। मेरे पास 5 अलग-अलग आकार के दो मोड हैं (पोर्ट्रेट और लैंगस्केप)। ImageView आकार को नियंत्रित करने के लिए शैली का भी उपयोग करें? इस तरह मेरे पास दो छवियों और अभिविन्यास/चित्र शैलियों के 5 जोड़े के साथ एक ही लेआउट होगा। (रिमोट व्यू की सीमाओं के आसपास काम करना मजेदार नहीं है ;-))। – user1139880

+0

अच्छी तरह से काम करता है। यह एक बड़ी मदद थी! धन्यवाद कीहान। – user1139880

+0

सुझाए गए समाधान में [स्टाइल रिसोर्सेज] (http://developer.android.com/guide/topics/resources/style-resource.html) का उपयोग शामिल है – denispyr

0

यह संभव नहीं है। (मैंने स्ट्रिंग के रूप में fill_parent को परिभाषित करने का प्रयास किया और लेआउट_विड्थ के लिए इसका उपयोग किया और यह भी विफल हो जाता है।)

आप 2 लेआउट का उपयोग क्यों नहीं करते?

  1. रेस/लेआउट/may_layout.xml
  2. रेस/लेआउट भूमि/may_layout.xml

कौन सा प्रत्येक सही imageView परिभाषित दिखाने के लिए।

इसके अतिरिक्त, बहु-भाषाओं का समर्थन करने के लिए मूल्य-भूमि होने पर आपको समस्या हो सकती है। (आपको प्रत्येक भाषा के लिए मूल्य-एक्सएक्स-भूमि की आवश्यकता होगी)

+1

धन्यवाद कैल्विन। मैं लेआउट को डुप्लिकेट करने से बचने की कोशिश कर रहा था, जब तक कि मैं उन्हें बिल्ड समय पर टेम्पलेट से स्वचालित रूप से उत्पन्न नहीं कर सकता। पता नहीं है कि ग्रहण इसका समर्थन करता है और यह कितना मानक होगा। – user1139880

39

यह एक पुरानी सवाल है कि पहले से ही स्वीकार किया गया है है, लेकिन निम्न समाधान किसी और मदद मिल सकती है:

आप res/values ​​/ एंड्रॉयड स्रोत कोड में attrs.xml जाँच हैं, तो आप की परिभाषा देखेंगे इस तरह दृश्यता संपत्ति:

<!-- Controls the initial visibility of the view. --> 
    <attr name="visibility"> 
     <!-- Visible on screen; the default value. --> 
     <enum name="visible" value="0" /> 
     <!-- Not displayed, but taken into account during layout (space is left for it). --> 
     <enum name="invisible" value="1" /> 
     <!-- Completely hidden, as if the view had not been added. --> 
     <enum name="gone" value="2" /> 
    </attr> 

यह विशेषता एक स्ट्रिंग मान उम्मीद (दृश्य, अदृश्य, चला गया) कि में परिवर्तित हो जाएगा (0, 1, 2) क्रमशः। तो, अगर आप इस तरह इन मूल्यों से युक्त पूर्णांक संसाधनों की घोषणा कर सकते हैं:

मूल्यों/integers.xml

<integer name="visible_in_portrait">2</integer> <!-- This is GONE --> 

मान-भूमि/integers.xml

<integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE --> 

हालांकि, अगर आप बनाना चाहते यह हर बार इन न्यूमेरिक स्थिरांक अनुमान लगाने से रोकने के लिए बेहतर होता है, आप ऐसा कर सकते हैं:

मान/integers.xml

<!-- These are alias for the constants we'll reference below --> 
<integer name="view_visible">0</integer> <!-- This is VISIBLE --> 
<integer name="view_invisible">1</integer> <!-- This is INVISIBLE --> 
<integer name="view_gone">2</integer> <!-- This is GONE --> 

<integer name="visible_in_portrait">@integer/view_gone</integer> <!-- We're referencing the visibility alias we declared above --> 

मान-भूमि/integers.xml

<integer name="visible_in_landscape">@integer/view_visible</integer> 

आप इस दृष्टिकोण या Keyhan ने सुझाव दिया एक का उपयोग कर सकते हैं। वह बेहतर चुनें जो आपको बेहतर लगे।

+5

यह ' – TalkLittle

+0

की बजाय उन्हें '' के रूप में घोषित करने का भी काम करता है, अच्छा अभ्यास वास्तविक एंड्रॉइड मानों को दृश्यमान, अदृश्य और चलाए जाने के लिए रखना होगा (0, 1, 2, लेकिन 0, 4, 8) –

+3

अच्छी तरह से , यह असाधारण नहीं है कि यह कैसे काम करता है। यदि आप 'व्यू' क्लास कोड की जांच करते हैं, तो इन मानों (0, 1 और 2) का उपयोग इस सदस्य की स्थिति तक पहुंचने के लिए किया जाता है: 'निजी स्थिर अंतिम int [] VISIBILITY_FLAGS = {दृश्यमान, अविश्वसनीय, GONE};'। यही कारण है कि आप 0, 4 और 8 का उपयोग नहीं कर सकते हैं, क्योंकि 0, 1 और 2 दृश्यमान, अविश्वसनीय और सूचकांक के लिए खड़े हैं। –