2013-05-07 33 views
0

我有有像這樣的變量的GLRendering類變量:無法訪問在GLSurfaceview類中聲明自Activity類沒有靜態

public class MyGLRenderer implements GLSurfaceView.Renderer{ 

int width; 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 

//I know these values are being set here correctly here to the devices width and height 
//Confirmed using Logging 

this.width = width; 
this.height = height; 


} 


} 

在我的活動類,我創造我GLSurfaceView類的一個實例並試圖經由所述對象來獲取寬度的值,象這樣:

public class MainActivity extends Activity { 

private GLSurfaceView myView; 
MyGLRenderer render; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //Request full screen 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    myView = new MyGLSurfaceView(this); 
    render = new MyGLRenderer(myView); 

    setContentView(myView); 
} 

我有一個內部類在我的活動類,它是從這個類的的onTouchEvent()方法,我需要訪問此「寬度」可變,如下所示:

class MyGLSurfaceView extends GLSurfaceView { 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

Log.v("Testing","Value of width is: "+render.width) 

當我從我的onTouchEvent()方法註銷值時,它返回0.爲什麼?我知道它不是0,實際上是設備屏幕的寬度。

如果我將MyGLSurfaceView類中'width'變量的聲明更改爲static那麼它工作正常,但我在我的Activity類中創建MyGLSurfaceView類實例的原因是因爲我沒有想要使用靜態。我想訪問它,而不使用靜態。

我也試過使用getter方法,並且得到相同的結果。

請有人能幫助我理解這種行爲,以及如何得到它嗎?由於

+0

看起來像onSurfaceChanged永遠不會被調用,或調用寬度等於0.你確定onSurfaceCHanged被調用? – 2013-05-07 17:57:33

+0

嗨@ZouZou如上所述,如果我聲明變量爲靜態,它工作正常。另外,我在我的onSurfaceChanged()方法中加載了所有的資源(圖形,聲音等),遊戲運行良好,所以它完全被調用並正在運行。如果沒有Static,它只會返回寬度變量的初始值。如果我將它設置爲100像int width = 100;那麼它總是會返回100;但如果我直接從onSurfaceChanged方法記錄它,它將註銷正確的值。 :-) – Zippy 2013-05-07 18:02:33

+0

你在模擬器或真實設備上運行你的應用程序嗎? – 2013-05-07 18:08:31

回答

1

自評感動:

只有兩種可能性訪問width屬性時,爲什麼你越來越爲零。 1.正如我在之前的評論中所寫的那樣:你正在訪問一個錯誤的實例或2.該屬性確實爲零。因此,添加一些日誌到你的代碼。我會記錄渲染器類的構造以及對width屬性的任何更改。這應該可以幫助你找到問題。您可以添加並記錄一個唯一的UUID給渲染器,因此您始終知道日誌條目來自哪個實例。

+0

乾杯,你說得對,我必須使用已經創建的渲染器對象,而不是使用:new setRenderer(MyGLRenderer(this));我移動了我的'renderer = new MyGLRenderer();到MyGLSurfaceView的構造函數,然後像這樣設置它:setRenderer(renderer),然後我能夠使用該渲染器對象來訪問變量。謝謝! – Zippy 2013-05-07 20:23:41