2011-10-20 14 views
11

मुख्य गतिविधिकिसी अन्य वर्ग से गतिविधि कक्षा में सार्वजनिक विधि को कॉल करें?

public class MyActivity() extends Activity 
    { 
     onCreate() 
     { 
      MyClass myobj=new MyClass();  
     } 
     public void Mymethod() 
     {} 
    } 
//HELPER CLASS IN A SEPARATE FILE  
    public class MyClass() 
    { 
     MyClass(Context context) 
     { 

     } 
    } 

मैं() MyClass का एक उदाहरण से MyMethod कॉल करने की कोशिश। मैं वास्तव में किसी भी मदद की सराहना करता हूं। धन्यवाद।

+0

पोस्ट कोड है कि आप MyMethod बुला कोशिश करने के लिए उपयोग किया है()। क्या आप माइएक्टिविटी ऑब्जेक्ट को तुरंत चालू कर रहे हैं? यदि नहीं, तो मुझे नहीं लगता कि आप myMethod() को कॉल करने में सक्षम होंगे क्योंकि यह स्थिर नहीं है। आप myMethod() स्थिर बनाने का प्रयास कर सकते हैं और फिर आप MyActivity.myMethod() को अपने MyClass से उपयोग करने में सक्षम होना चाहिए। अनुलेख मुझे उम्मीद है कि आपने यहां प्रदर्शन उद्देश्यों के लिए अपने वर्गों के नाम बदल दिए हैं।यदि वे हैं जिन्हें वे वास्तव में आपके प्रोजेक्ट में उपयोग कर रहे हैं तो आपको अधिक वर्णनात्मक नामों का उपयोग करने पर गंभीरता से विचार करना चाहिए। यह आपके कोड को समझने में आसान बना देगा। – FoamyGuy

+0

@Tim मैंने MyClass में कन्स्ट्रक्टर को पास किए गए संदर्भ का उपयोग करके कॉल करने का प्रयास किया, जैसे .. – Deepak

+0

क्रियाकलापों पर स्थैतिक तरीकों के लिए यह बहुत बुरा अभ्यास है, मैं आपको सलाह देता हूं कि आपको क्या करने की ज़रूरत है गतिविधि पर एक स्थिर विधि के बिना। – SnowyTracks

उत्तर

-8

मैंने हेल्पर क्लास माई क्लास को माईएक्टिविटी क्लास के एक आंतरिक वर्ग के रूप में लिखने का फैसला किया। यह इसे मूल वर्ग तक पूर्ण पहुंच की अनुमति देता है लेकिन बुरी बात यह है कि अब MyClass MyActivity क्लास तक ही सीमित है।

public class MyActivity() extends Activity 
{ 
    onCreate() 
    { 
     MyClass myobj=new MyClass(); 

    } 

    public void myMethod() 
    { 

    } 
} 
//INNER CLASS 
    public class MyClass 
    { 
     public MyClass() 
     { 

     } 
     //I can directly access the MyMethod 
     myMethod(); 
    } 
+0

मैं इसे केवल उत्तर के रूप में चुन रहा हूं क्योंकि मैंने इस समाधान का उपयोग किया था। अन्य समाधान समान रूप से दिलचस्प लगते हैं। – Deepak

+3

आप किसी और को जवाब क्यों देते हैं और इसे अपनी पोस्ट पर चेक के रूप में चिह्नित करते हैं? यह अजीब है ... –

8

कि विधि के रूप में स्थिर बनाने ताकि आप वर्ग वस्तु

public static void Mymethod() 
{} 

बनाए बिना फोन और इस तरह से

MainActivity.Mymethod(); 
+0

मैं विधि को स्थिर के रूप में नहीं बना सकता क्योंकि यह गैर स्थिर चर का संदर्भ देता है। तो MyClass को गतिविधि वर्ग की आंतरिक श्रेणी के रूप में एकमात्र समाधान – Deepak

+0

ठीक कर रहा है ठीक है अगर आपको समाधान मिला है तो इसे अच्छी तरह से रखें – Pratik

21

की तरह कॉल कर सकते हैं क्यों नहीं बस

की तरह निर्माता के लिए गतिविधि पारित
public class MyActivity extends Activity { 

    onCreate(){ 
     MyClass myobj=new MyClass(MyActivity.this);  
    } 

    public void myMethod(){ 

    } 
} 

//HELPER CLASS IN A SEPARATE FILE  
public class MyClass{ 
    public MyClass(MyActivity act) { 
     act.myMethod(); 
    } 
} 
2

मेरे पास एक आंतरिक वर्ग था जिसे मैं एक और सामान्य पुस्तकालय "हेल्पर" कक्षा में खींचना चाहता था। मेरे पास वही समस्या थी जो आप करते थे। मैं एक सार तत्व विधि के साथ, सहायक वर्ग सार बनाकर इसके चारों ओर मिल गया। फिर मेरे प्रोजेक्ट पैकेज में मैंने विशिष्ट वर्ग में एक कन्स्ट्रक्टर कॉल के साथ सहायक वर्ग बढ़ाया।

public class MyActivity extends Activity { 
    onCreate() { 
     MyHelperClass = new MyHelperClass(this, "foobar"); 
    } 

    public void myMethod() { 
     // Code... 
    } 
} 

// In a different file 
public class MyHelperClass extends HelperClass { 
    private MyActivity mInstance; 

    public MyHelperClass(MyActivity act, String data) { 
     super(); 
     this.mInstance = act; 
     this.mActivity = act; // Useful for calling generic Activity methods in the HelperClass 
     this.mData = data; 
    } 

    protected void callMyActivityMethod() { 
     mInstance.myMethod(); 
    } 
} 

// In a different file 
public abstract class HelperClass { 
    protected Activity mActivity; 
    protected String mData; 

    public HelperClass() { 
     // Subclass will set variables 
    } 

    protected abstract void callMyActivityMethod(); 

    // More code for all the other stuff the class does 
} 

इस तरह, मैं एक सहायक वर्ग है कि "काम" के विशाल बहुमत शामिल है, और सभी मैं क्या करना है आदेश तक पहुँच प्राप्त करने में निर्माता के साथ एक उपवर्ग और एक विधि बनाने के है कॉलिंग गतिविधि की रुचि की विधि।

2

यदि मैं आपको सही ढंग से समझ रहा हूं तो मुझे विश्वास है कि आप कॉलबैक के रूप में इंटरफ़ेस का उपयोग करके अपनी समस्याओं का समाधान कर सकते हैं।

//// गतिविधि /////////////////////////////////

public class MyActivity() extends Activity { 

    onCreate() 
    { 
     MyClass myObj=new MyClass(); 

     //Set the listener on the object. Created as anonymous 
     myObj.setListener(new MyClass.Listener() { 
      myMethod(); 
     }); 
    } 
} 

public void myMethod(){ 

} 

////// कस्टम क्लास //////////////////

public class MyClass { 
    Listener mListener; 

    public interface Listener { 
      public void onInterestingEvent(); 
    } 

    public void setListener(Listener listener) { 
      mListener = listener; 
    } 

    public void someUsefulThingTheClassDoes() { 
      //Do your code here and when you're ready to call the activity's method do this 
      mListener.onInterestingEvent(); 
    } 
} 
7

यह संभवतः ऐसा करने का सबसे अच्छा तरीका है। इस तरह मैं इसे कर रहा हूँ। यह एक सिंगलटन डिजाइन पैटर्न कहा जाता है:

public class MyActivity extends Activity { 
    private static MainActivity instance; 

    public static MainActivity getInstance() { 
    if(instance==null){ 
      setInstance(this); 
     } 
     return instance; 
    } 

    public static void setInstance(MainActivity instance) { 
     MainActivity.instance = instance; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setInstance(this); 
    } 
} 
+1

आप स्थिर सेट इंस्टेंस से "यह" का उपयोग नहीं कर सकते हैं, लेकिन हो सकता है कि यह एक अच्छी विधि है, सिर्फ यह जानना चाहें कि उस वर्ग को तत्काल –

+0

है। नहीं। यह एक संसाधन रिसाव है जो –

1

आपके पास किसी अन्य वर्ग में MainActivity का उदाहरण पारित करने के लिए है, तो आप हर जगह से सब कुछ सार्वजनिक (MainActivity में) कॉल कर सकते हैं।

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    // Instance of AnotherClass for future use 
    private AnotherClass anotherClass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // Create new instance of AnotherClass and 
     // pass instance of MainActivity by "this" 
     anotherClass = new AnotherClass(this); 
    } 

    // Method you want to call from another class 
    public void myMethod(){ 
     ... 
    } 
} 

AnotherClass.java

public class AnotherClass { 

    // Main class instance 
    private MainActivity mainActivity; 

    // Constructor 
    public AnotherClass(MainActivity activity) { 

     // Save instance of main class for future use 
     mainActivity = activity; 

     // Call method in MainActivity 
     mainActivity.myMethod(); 
    } 
} 
+0

होने का इंतजार कर रहा है यदि मैं आपके समाधान का उपयोग करता हूं और कक्षाओं तक पहुंचने के लिए 2 गतिविधियां कहती हूं, तो कक्षा में कोई तरीका है यह निर्धारित करने के लिए कि कौन सा गतिविधि संदर्भ उपयोग किया जा रहा है? मेरी विशेष कक्षा को 2 अलग-अलग गतिविधियों से एक्सेस किया जाता है, जैसा कि आपने प्रत्येक के लिए दिखाया है, मैं इसे सेट करने में सक्षम हूं, बस सोच रहा हूं कि संदर्भ को सामान्य चर में सेट करना संभव है जिसका उपयोग मेरी कक्षा में किया जा सकता है? CurrentContext की तरह कुछ = जो कभी भी गतिविधि संदर्भ का उपयोग किया जा रहा है, इसलिए जब मुझे संदर्भ संदर्भित करना है, तो मैं मुख्य एक्टिविटी या दूसरी एक्टिविटी के स्थान पर currentcContext का उपयोग कर सकता हूं। – snowman

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