2010-11-08 12 views
6

मैं एक Android ओपन आवेदन शुरू कर दिया और मैं निम्नलिखित श्रेणियां होती हैं:एंड्रॉयड XML का उपयोग ओवरले के साथ glSurfaceView/जावा

class A extends Activity 
class B extends GlSurfaceView implements Renderer 

जब क्लास ए के onCreate कहा जाता है, यह प्रकार वर्ग बी की एक वस्तु बनाता है और कहता है:

setContentView(Bobject) 

अब तक यह काम करता है और मैंने इसमें कुछ दिन बिताए।

अब मैं अपने आवेदन में बटन जोड़ना चाहता था और SurfaceViewOverlay उदाहरण पाया। यह दृश्य पदानुक्रम बनाने के लिए कुछ एक्सएमएल का उपयोग करता है। मैं बहुत मैं करने के लिए कुछ इसी तरह बस में कटौती बनाएं और उसे XML कोड पेस्ट करना चाहता था:

<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    <LinearLayout android:id="@+id/hidecontainer" 
      android:orientation="vertical" 
      android:visibility="gone" 
      android:background="@drawable/translucent_background" 
      android:gravity="center" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
      ... 

अब मन में अपने मूल वर्ग पदानुक्रम रखते हुए, मैं अपने विचारों कैसे प्रारंभ होगा? मुझे अपनी कक्षा ए के क्रिएट() में क्या लिखना चाहिए?

मैं उपयोग करने की कोशिश:

Bobject = new B(this); 
GLSurfaceView glSurfaceView = 
     (GLSurfaceView) findViewById(R.id.glsurfaceview); 
    glSurfaceView.setRenderer(Bobject); 

और यह बटन और स्क्रीन पर जीएल दृश्य आकर्षित करता है, लेकिन जीएल दृश्य नल/क्लिक से किसी भी इनपुट में लेने में असमर्थ है।

इस रूप में यह केवल एक के रूप में इस्तेमाल किया जा रहा है क्योंकि Bobject के onTouchEvent() कहा जाता है नहीं कर रहा है की संभावना है:

Renderer 

और नहीं एक:

glSurfaceView 

वस्तु।

उपरोक्त कोड के बजाय, मैं वास्तव में क्या चाहता हूं कि बॉबजेर glSurfaceView को प्रतिस्थापित करे। लेकिन मुझे नहीं पता कि यह कैसे करना है। जब मुझे लगता है ViewById(), ऐसा लगता है कि glSurfaceView पहले से ही बनाया गया है। जीएल व्यू के लिए टाइप बी के ऑब्जेक्ट का उपयोग करने के लिए मैं इसे कैसे कह सकता हूं?

किसी भी नौसिखिया गलतियों के बारे में खेद है। एंड्रॉइड के लिए पूरी तरह से नया।

संपादित करें: मैं भी करने की कोशिश की इस:

मैं भी करने की कोशिश की है:

<com.bla.bla.B 
      android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

और मेरे एक वर्ग निर्माता मैं बोल रहा हूँ में: मेरी एक्सएमएल फ़ाइल में, मैं करने के लिए GLSurfaceView बदल दिया है:

// This returns null 
Bobject = (B) findViewById(R.id.glsurfaceview); 

// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay); 

मुझे अपनी कस्टम कक्षा का उपयोग कैसे करना चाहिए जो मेरी XML फ़ाइल/गतिविधि में glSurfaceView को विस्तारित करता है?

+1

मैं एक ही समस्या से फंस गया हूं और इस बात का प्रदर्शन करने वाला एक पूरा आवेदन नहीं मिला। क्या कोई कुछ उदाहरण एप्लिकेशन दिखा सकता है? मुझे कहीं भी एंड्रॉइड नमूनों से इस प्रसिद्ध SurfaceOverlayView उदाहरण नहीं मिल रहा है। अग्रिम में धन्यवाद। – rgngl

उत्तर

7

ठीक है, तो ऐसा करने का उचित तरीके से बी वर्ग जिसमें लेता में एक निर्माता है:

B(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 

और एक्सएमएल लेआउट में, इस का उपयोग करें:

<com.bla.bla.B 
     android:id="@+id/glsurfaceview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

मेरे कोड में जो चीज गायब थी वह कन्स्ट्रक्टर हस्ताक्षर थी।

+0

मुझे वही चीज़ जोड़ना "कन्स्ट्रक्टर ऑब्जेक्ट (संदर्भ, विशेषता एसईटी) अनिर्धारित है" क्या आप मुझे मार्गदर्शन कर सकते हैं? – JehandadK

+0

मैंने रेंडरर क्लास में जोड़ा है। – JehandadK

+0

बड़ा धन्यवाद, बहुत उपयोगी है – zest

1

इसे हल करने का एक वैकल्पिक तरीका है, गतिविधि ए से जुड़े अपने विचार छोड़ना।,

<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

फिर आप गतिविधि एक में अपने बी वस्तु का उल्लेख कर सकते: तो बजाय setContentView (बी वस्तु) आप setContentView (ए वस्तु) और अपने "एक एक्सएमएल" फाइल के अंदर का उपयोग का उपयोग करने का, GLsurfaceView दृश्य है क्योंकि यह बढ़ा-चढ़ा कर किया गया था जब आप एक को setContentView, बी के बजाय:

GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.glsurfaceview); 


glSurfaceView.setRenderer(); //no longer have to pass the object 

मैं ईमानदारी से यकीन है कि कैसे यह वास्तव में जिस तरह से आप चाहते हैं काम करने के लिए प्राप्त करने के लिए नहीं कर रहा हूँ, लेकिन आपके मामले में मैं नहीं यकीन है कि यह अंत में कर रहा हूँ एक फर्क पड़ता है। फिर फिर, मैं अभी भी एक नौसिखिया हूँ। मुझे यह जानने में दिलचस्पी होगी कि इसे वैकल्पिक तरीके से कैसे किया जाए क्योंकि मैंने आज भी इसी तरह के प्रश्न पूछा था।

+0

सुनिश्चित नहीं है कि मैं आपके एक्सएमएल संशोधन प्रस्ताव को समझता हूं। क्या यह बिल्कुल मेरे एक्सएमएल जैसा नहीं है (जिसे मैंने सतहफेव ओवरले उदाहरण से काटा और पेस्ट किया है)? मेरी मुख्य समस्या यह है कि क्लिक बॉबजेक्ट के टचएवेंट() विधि से गुज़र नहीं रहे हैं। मुझे विश्वास है कि यह इस तथ्य के कारण है कि मैं इसे एक रेंडरर के रूप में उपयोग कर रहा हूं, न कि SurfaceViewObject। SurfaceViewObject मैं उपयोग कर रहा हूँ वह एक हैViewById() द्वारा लौटाया गया है। –

+0

सावधानी से पढ़ें, मैं इसे बदलने का प्रस्ताव नहीं दे रहा हूं, मैं इसे बदलने के लिए कहां बदल रहा हूं। बी के बजाए ए लेआउट में सतही दृश्य एक्सएमएल रखें और ए को फुलाएं। केवल बी के लेआउट को बढ़ाने की जरूरत नहीं है, जब आपके सभी विचार शामिल हैं। – user432209

+0

मुझे अभी भी यह नहीं मिला है। मैं अब setContentView (बॉबजेक्ट) का उपयोग नहीं कर रहा हूं। मैं एसडीके से उदाहरण का पालन कर रहा हूं। मैं उपयोग कर रहा हूं: setContentView (R.layout.surface_view_overlay); मुझे R.layout.surface_view_overlay के बजाय बॉबरेक्ट का उपयोग करना अच्छा लगेगा, लेकिन यह कोई बटन नहीं दिखाता है। –

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