2010-02-07 6 views
5

में "गैर-स्थैतिक विधि के लिए स्थिर संदर्भ नहीं बना सकता" मुझे अपने एंड्रॉइड प्रोग्राम में पुरानी "गैर-स्थैतिक विधि का स्थिर संदर्भ नहीं दे सकता" त्रुटि के साथ कुछ समस्याएं हैं। मैं एक रेत गिरने वाला गेम (पाउडर गेम के समान) बना रहा हूं और मैंने ब्रश आकार (जो ठीक काम करता है) के लिए स्लाइडर के साथ स्क्रीन के निचले हिस्से में एक नियंत्रण बार बनाने के लिए नियंत्रण नामक एक वर्ग बनाया है और एक पॉप अप करने के लिए एक बटन उपयोगकर्ताओं को चयनित तत्व चुनने की अनुमति देने के लिए संवाद। हालांकि, जब मैं अपने कोड से DemoActivity.ShowDialog (2) को कॉल करता हूं, तो यह गैर स्थैतिक त्रुटि के स्थिर संदर्भ देता है (डेमोएक्टिविटी मेरे आवेदन की मुख्य गतिविधि है)। मैंने इसे गतिविधि.शोडायलॉग (2) में बदलने की भी कोशिश की, लेकिन मुझे बिल्कुल वही त्रुटि मिली! कृपया मदद करें, मैं क्या गलत कर रहा हूँ? यहाँ पहले से मेरी कोड और धन्यवाद है:एंड्रॉइड

package sand.falling.opengl; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.SeekBar; 

public class Control extends LinearLayout 
{ 
    private ImageButton control_button; 
    private SeekBar brush_size_slider; 

    final CharSequence[] elementslist = {"Sand", "Water", "Plant", "Wall", "Fire", "Ice", "Generator", "Oil", "Magma", "Stone", "C4"}; 

    public Control(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     control_button = (ImageButton) findViewById(R.id.element_picker_button); 
     brush_size_slider = (SeekBar) findViewById(R.id.brush_size_slider); 

     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          //THIS DOESN'T WORK!!!! 
          DemoActivity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
     control_button.setImageResource(R.drawable.palette); 

     brush_size_slider.setOnSeekBarChangeListener 
      (
        new SeekBar.OnSeekBarChangeListener() 
        { 
         public void onProgressChanged(SeekBar seekbar, int progress, boolean fromTouch) 
         { 
          int p = 32 * progress/100; 
          DemoActivity.setBrushSize(p); 
          Log.v("DemoActivity", "size:" + p); 
         } 
         public void onStartTrackingTouch(SeekBar seekbar) {} 
         public void onStopTrackingTouch(SeekBar seekbar) {} 
        } 
      ); 
     brush_size_slider.setProgress((int)400/32); 
    } 
} 

संपादित करें:

public class Control extends LinearLayout 
{ 
    private DemoActivity activity; 
     ... 
    public void setActivity(DemoActivity act) 
    { 
     activity = act; 
    } 
     ... 
     //Set a click listener for the button which should pop up element picker dialog when clicked 
     control_button.setOnClickListener 
      (
        new OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          activity.showDialog(2); //Run the element picker dialog 
         } 
        } 
      ); 
} 

और फिर DemoActivity.java की मेरी onResume अनुभाग से control.setActivity(this); बुला: मैं अपने Control.java कोड के लिए निम्न जोड़कर तय ! उम्मीद है कि यह आपके जैसे ही मुद्दों के साथ मदद करता है !!

उत्तर

12

आपको showDialog पर DemoActivity उदाहरण पर कॉल करना है, कक्षा में नहीं। ClassName.methodName() पर कॉल करने का एकमात्र समय यह है कि विधि को स्थैतिक के रूप में परिभाषित किया गया है। showDialog एक स्थिर विधि नहीं है।

इसे ठीक करने के लिए, आपको या तो एक नया DemoActivity चालू करने या मौजूदा प्राप्त करने की आवश्यकता है, फिर उस पर showDialog पर कॉल करें।

संपादित करें: आप पहले से ही एक DemoActivity उदाहरण है, तो जब आप इस Control वस्तु का दृष्टांत, शायद निम्नलिखित संशोधन काम करेगा:

public class Control extends LinearLayout 
{ 

    ... 

    // add an Activity instance 
    private Activity activity; 

    // set the Activity in your constructor 
    public Control(Context context, AttributeSet attrs, Activity activity) 
    { 
     super(context, attrs); 
     this.activity = activity; 
    } 

    @Override 
    protected void onFinishInflate() 
    { 
     ... 

      // Use the instance activity here 
      activity.showDialog(2); 
     ... 
    } 
} 
+0

आह, मैं मैं समझ गया लगता है। मैं डेमोएक्टविटी क्लास के विशिष्ट उदाहरण का संदर्भ प्राप्त करने के बारे में कैसे जाउंगा। AFAIK, मैं खुद को नहीं बनाता, एंड्रॉइड स्वचालित रूप से करता है जब उपयोगकर्ता मेरा ऐप चलाता है, तो मैं इसका संदर्भ कैसे दूं? तेजी से जवाब बीटीडब्ल्यू के लिए धन्यवाद! – gkanwar

+1

हम्म, यकीन नहीं है, मैंने अभी तक कोई एंड्रॉइड विकास नहीं किया है। मैं डेमोएक्टिविटी दस्तावेज की तलाश करूंगा। क्या डेमोएक्टिविटी में 'इंस्टेंस() 'या' getInstance() 'विधि है? यदि ऐसा है, तो हो सकता है कि आपको क्या चाहिए। –

+0

खैर, डेमोएक्टिविटी एक वर्ग है जिसे मैंने बनाया है जो मूल एंड्रॉइड कोड में निहित सामान्य गतिविधि वर्ग को बढ़ाता है। मैंने एंड्रॉइड में गतिविधि के लिए प्रलेखन देखा, और getInstanceCount() नामक एक फ़ंक्शन है, लेकिन इंस्टेंस() या getInstance() जैसी कुछ भी नहीं है। – gkanwar

0

अगर बनाने Android के द्वारा कहा जाता है, तो आप का निर्माण नहीं करतीं उदाहरण के लिए, बस में डाल दिया mShowDialog=this या mShowDialog=pShowDialog

दूसरे शब्दों में बना सकते हैं - है भी आपको लगता है कि उदाहरण के मूल्य प्राप्त करने के लिए एक सार्वजनिक प्राप्त जोड़ सकते हैं उदाहरण के मूल्य बचाने पैदा करते हैं। तो फिर तुम गेटर निवेदन द्वारा अमूर्त के माध्यम से उदाहरण के समारोह का उपयोग कर सकते हैं:

ABSTRACTCLASS.getInstance().applyFunction();