2013-06-04 97 views
0

我想添加一個自定義的surfaceView類到已經在xml佈局中聲明的surfaceView。問題是我無法獲得自定義類添加xml定義的surfaceView。一些它如何不啓動。Android - 添加自定義surfaceView到XML定義的surfaceView不工作

這是我的代碼:
MainActivity

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    sineWaveSurfaceView = (SineWaveSurfaceView) findViewById(R.id.surfaceView); 
} 

MainActivity佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

    <mark.dijkema.android.eindopdracht.SineWaveSurfaceView 
     android:id="@+id/surfaceView" 
     android:layout_width="fill_parent" 
     android:layout_height="100dp" 
     android:layout_marginTop="20dp" /> 

    <ListView 
     android:id="@+id/song_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dp" > 
    </ListView> 

</RelativeLayout> 

SineWaveSurfaceView類

public class SineWaveSurfaceView extends SurfaceView implements SurfaceHolder.Callback 
{ 
private Context context; 

public SineWaveSurfaceView(Context context) 
{ 
    super(context); 
    // TODO Auto-generated constructor stub 

    this.context = context; 
    getHolder().addCallback(this); 

    Log.e("constructor", "done"); 
} 

public SineWaveSurfaceView(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

public SineWaveSurfaceView(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

protected void OnDraw(Canvas canvas, int value) 
{ 
    //canvas.drawColor(Color.WHITE); 

    Paint paint = new Paint(); 
    paint.setColor(Color.WHITE); 

    float y = Float.valueOf(String.valueOf(value)); 

    for(float x = 0; x < 200; x += 0.1f) 
    { 
     canvas.drawPoint(x, y, paint); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) 
{ 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder arg0) 
{ 
    // TODO Auto-generated method stub 

    Log.e("start", "started"); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder arg0) 
{ 
    // TODO Auto-generated method stub 

} 

} 

問題是Log.e(「構造函數」,「完成」);在SineWaveSurfaceView的構造函數中甚至沒有出現。

我是什麼做錯了,因爲當我做這樣的事情

sineWaveSurfaceView = new sineWaveSurfaceView(this); 

然後它的工作原理,但它並不附着在XML佈局定義的surfaceView。

+1

當從xml中膨脹時,它就是被調用的參數'Context'和'AttributeSet'的構造函數:http://stackoverflow.com/questions/8113621/which-constructor-to-be-called-for-view 。也許你想在那裏添加你的Log.e! – verybadalloc

+0

感謝您的解釋。 ;)似乎現在正在工作。 – DijkeMark

+1

也許你可以創建一個答案,以便我們可以將其標記爲已解決? – verybadalloc

回答

4

正如veryBadalloc在註釋中解釋的那樣,它似乎是從xml的膨脹開始的第二個構造函數,因此我的代碼畢竟工作。

相關問題