2011-08-10 19 views
8

मेरे पास 2 अलग-अलग लेआउट फ़ाइलें हैं जिन्हें मैं एक ही डेटा को संशोधित करने के लिए उपयोग करना चाहता हूं, मैं "संपादन दृश्य" के लिए अपने लेआउट पर स्विच करना चाहता था जो उपयोगकर्ता को ग्राफ डेटा को संशोधित करने की अनुमति देता है और फिर उन्हें "विस्तृत दृश्य" पर वापस जाने की अनुमति दें जो एक विस्तृत ग्राफ प्रदर्शित करता है (androidplot लाइब्रेरी का उपयोग करके)।एंड्रॉइड गतिविधि में 2 लेआउट के बीच स्विचिंग

मेरी समस्या यह है कि, मेरे "संपादित दृश्य" पर वापस स्विच करते समय मेरी ग्राफ़ेड लाइनें चली जाती हैं और केवल धुरी ड्रॉ होती हैं (इसलिए लेआउट स्विच और ऑनड्रा() को मेरे ग्राफ़ व्यू के लिए बुलाया जा रहा है)। सब कुछ एक ही गतिविधि में संग्रहीत किया जाता है, इसलिए मुझे समझ में नहीं आता कि यह क्यों काम नहीं कर रहा है?

रेखाएं ग्राफ़ व्यू ऑब्जेक्ट के भीतर ही संग्रहीत की जाती हैं जो लगातार चलनी चाहिए क्योंकि यह मेरी गतिविधि में एक संग्रहित चर है।

मैं बटन क्लिक पर लेआउट फ़ाइलों को स्विच करने के लिए इन दो विधियों का उपयोग करता हूं।

public class GraphLibActivity extends Activity { 

    private Graph graph; 

    private boolean editView; 

    private static TextView coordTextView; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     editView = true; 

     setContentView(R.layout.graphlib); 



     graph = (Graph) findViewById(R.id.graph); 

     coordTextView = (TextView)findViewById(R.id.currentCoords); 


     (lots of calculations) 
     graph.addLine(gelHistogramPoints, linePaint); 



     graph.invalidate();  
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     if(editView == true){ 
      inflater.inflate(R.menu.activity_menu, menu); 
     }else{ 
      inflater.inflate(R.menu.detailed_view_menu, menu); 
     } 
     return true; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu){ 
     menu.clear(); 
     MenuInflater inflater = getMenuInflater(); 
     if(editView == true){ 
      inflater.inflate(R.menu.activity_menu, menu); 
     }else{ 
      inflater.inflate(R.menu.detailed_view_menu, menu); 
     } 
     graph.invalidate(); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     // Handle item selection 
     switch (item.getItemId()) { 


     case R.id.detailed_view: 
      editView = false; 
      setContentView(R.layout.imagegraph); 
      return true; 


     case R.id.edit_view: 
      editView = true; 
      setContentView(R.layout.editgraph);    
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
     } 

    } 




} 

उत्तर

23

प्रत्येक बार जब आप setContentView को कॉल करते हैं तो आप लेआउट को बढ़ा रहे हैं ताकि डेटा दोबारा सेट किया जाना चाहिए। क्या तुम कर रहे हो

वैसे भी, मैं दो लेआउट को एक फ़ाइल में विलय करने की अनुशंसा करता हूं। फिर एक लेआउट से दूसरे लेआउट में बदलने के लिए ViewFlipper का उपयोग करें। यही कारण है कि करने के लिए कुछ इसी तरह दिखेगा:

graph.xml:

ViewFlipper vf = (ViewFlipper) findViewById(R.id.viewFlipper); 
vf.showNext(); 

आशा है कि यह मदद करता है:

<ViewFlipper android:id="@+id/viewFlipper"> 
    <LinearLayout> 
     // Here would go the content of R.layout.imagegraph 
    </LinearLayout> 
    <LinearLayout> 
     // Here would go the content of R.layout.editgraph 
    </LinearLayout> 
</ViewFlipper> 

तो फिर तुम तो केवल आपकी गतिविधि में लेआउट स्विच करने के लिए showNext() कॉल करनी होगी। एक महान टिप के लिए

+0

धन्यवाद, यह बहुत अच्छा काम करता है। –

+4

मैं अनुमान लगाए बिना विशेष दृश्य दिखाना चाहता हूं कि आप 'अगली' या 'पहले' दृश्य उपयोग पर हैं: 'vf.setDisplayedChild (vf.indexOfChild (vfChildView))' – derenio

+0

आपके उदाहरण में, क्या आपको अभी भी रीसेट करना है सभी डेटा? यदि दोनों लेआउट में टेक्स्ट एडिट है, और मैं दो लेआउट से जानकारी मर्ज करना चाहता हूं, और इसे किसी तीसरे लेआउट में टेक्स्ट व्यू में रखना चाहता हूं, तो मैं यह कैसे करूँगा? –

5

आप हमेशा लेआउट क्यों बढ़ाते हैं? यह वास्तव में महंगा है। मर्ज लेआउट का उपयोग करने का प्रयास करें। ताकि आप visibilty बदल सकते हैं "गॉन" या "दर्शनीय" अधिक देखने के लिए: http://android-developers.blogspot.com/2009/03/android-layout-tricks-3-optimize-by.html

+0

+1। – scatmoi

0

मैं एक ऐप्स मैं पर काम कर रहा हूँ के लिए कुछ इसी तरह से करते हैं।

इसे हल करने का एक आसान तरीका एक्सएमएल में दूसरे दृश्य की डिफ़ॉल्ट दृश्यता android:visibility="GONE" पर सेट करना है, फिर कोड में प्रत्येक दृश्य की पहचान करें। इसके बाद आप view1.setVisibility(View.GONE) और view2.setVisibility(View.VISIBLE)

के साथ दृश्यता सेट कर सकते हैं उम्मीद है कि इससे मदद मिलती है! यह मेरे लिए बहुत अच्छा काम करता है :)

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