2011-11-02 10 views
8

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

और मेरे पास अलग-अलग वर्ग हैं जो प्रत्येक खुले हैं और लेआउट के साथ अपनी बात करते हैं।

मैं इन कक्षाओं को @Inject के माध्यम से गतिविधि में इंजेक्ट करता हूं। यह सब बिना किसी समस्या के है।

लेकिन जब मैं सक्रिय लेआउट में मौजूद नियंत्रणों में से एक पर @InjectView का उपयोग करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है।

11-02 19: 17: 31.086: त्रुटि/AndroidRuntime (1326): java.lang.NullPointerException: की वजह से वर्ग be.baes.notes.View.EditNoteImpl में शून्य मान इंजेक्षन नहीं कर सकते .saveButton जब फ़ील्ड @Nullable

यह कोड होगा।

public class EditNoteImpl implements EditNote { 
    @Inject CancelEditNoteClickListener cancelEditNoteClickListener; 
    @Inject SaveNoteClickListener saveNoteClickListener; 
    @Inject Provider<Activity> activity; 
    @InjectView(R.id.saveButton) Button saveButton; 

    /* (non-Javadoc) 
    * @see be.baes.notes.EditNote#activateEditNote() 
    */ 
    @Override 
    public void activateEditNote() 
    { 
     activity.get().setContentView(R.layout.editnote); 

     this.saveButton.setOnClickListener(saveNoteClickListener); 
    } 
} 

हालांकि मैं ऐसा कर सकता हूं।

public class EditNoteImpl implements EditNote { 
    @Inject CancelEditNoteClickListener cancelEditNoteClickListener; 
    @Inject SaveNoteClickListener saveNoteClickListener; 
    @Inject Provider<Activity> activity; 
    private Button saveButton; 

    /* (non-Javadoc) 
    * @see be.baes.notes.EditNote#activateEditNote() 
    */ 
    @Override 
    public void activateEditNote() 
    { 
     activity.get().setContentView(R.layout.editnote); 
     saveButton = (Button)activity.get().findViewById(R.id.saveButton); 

     this.saveButton.setOnClickListener(saveNoteClickListener); 
    } 
} 

क्या ऐसा करने का कोई बेहतर तरीका है?

+0

क्या कोई कारण है कि बटन @ Nullable बनाने का विकल्प नहीं है? –

+0

मैंने कोशिश की, लेकिन यह बटन को इंजेक्ट नहीं करता है। – chrissie1

+0

क्या आप RoboGuice 2.0 का उपयोग कर रहे हैं? यह * 2.0 – emmby

उत्तर

4

मैं सिर्फ roboguice का उपयोग करें ताकि अधिक अनुभव के साथ किसी और एक बेहतर जवाब देने के लिए सक्षम हो सकता है शुरू कर दिया है, लेकिन यह मैं अब तक क्या मिला है:

  • roboguice-1.1.2 में (वर्तमान स्थिर रिलीज), @InjectView आइटम केवल इंजेक्शन दिए जाते हैं जब setContentView() गतिविधि में पहली बार कहा जाता है। चूंकि आपका कोड सहायक कक्षाओं से setContentView() गतिशील रूप से कॉल करता है, इसलिए इंजेक्शन वाले आइटमों को सही ढंग से इंजेक्शन नहीं दिया जाएगा।

  • roboguice-2.0b2 (वर्तमान बीटा) में, एकाधिक setContentView() कॉल के लिए समर्थन है और आपका कोड काम करना चाहिए। हालांकि, इंजेक्शन वाले दृश्य अभी भी संदर्भ गतिविधि (घोषित कक्षा के बजाए) से जुड़े हुए हैं, इसलिए प्रत्येक @InjectView को समान गतिविधि साझा करने वाले सभी सहायक वर्गों में संभावित रूप से @Nullable होने की आवश्यकता होगी।

      :

    यहां मुद्दा यह लगता है के बाद से कई लेआउट में रूट किया गया (और इसलिए कई setContentView() कॉल) एक भी गतिविधि में, एक वैकल्पिक तरीका आप क्या चाहते हैं क्या करने के लिए इस प्रकार यह से बचने के लिए है

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <include layout="@layout/layout1" /> 

    <include layout="@layout/layout2" /> 

    <!-- other layouts... --> 

</FrameLayout> 
: इसके बजाय कई लेआउट होने के
  • , एक माता पिता FrameLayout में सभी लेआउट लोड करने के लिए <include/> टैग का उपयोग कर एक भी लेआउट का उपयोग
  • // instead of: activity.setContentView(R.layout.layout1); 
    // use: activity.showLayout(R.id.layoutview1); 
    public void showLayout(int layoutViewId) { 
        final View view = findViewById(layoutViewId); 
        final ViewGroup root = (ViewGroup) view.getParent(); 
        for (int i = 0; i < root.getChildCount(); i++) { 
         final View v = root.getChildAt(i); 
         v.setVisibility(v == view ? View.VISIBLE : View.GONE); 
        } 
    } 
    

    ऊपर विकल्प के लिए काम करना चाहिए:

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

      एक बात मैं नोट करना चाहिए कि वर्तमान "Upgrading from RoboGuice 1.1 to 2.0" पृष्ठ पर, निम्न का उल्लेख किया जाता है:

      (दृश्य में @InjectView उपयोग करने के लिए (हालांकि आप RoboGuice.injectMembers कॉल करने के लिए की आवश्यकता होगी की क्षमता) स्वयं, चूंकि कोई RoboView बेस कक्षा नहीं है और शायद कभी नहीं होगा)।

      ऐसा लगता है कि यह आप अपने सहायक वर्गों देखें से प्राप्त किया जा करने के लिए लागू करने और उन में @InjectView काम बेहतर (उम्मीद की कोई जरूरत नहीं है, क्योंकि वे कम गतिविधि से जुड़े होते हैं उन्हें @Nullable होने के लिए) बनाने के लिए अनुमति चाहिए। हालांकि, वर्तमान कोड को देखते हुए, यह सुविधा अभी तक लागू नहीं हुई प्रतीत होती है (हालांकि मैं गलत जगह पर देख रहा था)।

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