2011-11-18 62 views
1

我對這個簡單的代碼有問題。我嘗試了一切可能,但setContent(R.layout.main)總是會導致錯誤。如果我嘗試調試代碼svgView =(SVGView)findViewById(R.id.svgview)值始終爲空。ImageView findViewById和setContent(R.layout.main)不起作用

這是我的代碼:

SVGViewActivity.java:

package android.svgview; 

    import com.larvalabs.svgandroid.SVG; 
    import com.larvalabs.svgandroid.SVGParser; 

    import android.app.Activity; 
    import android.graphics.Color; 
    import android.os.Bundle; 

    public class SVGViewActivity extends Activity { 
     /** Called when the activity is first created. */ 

    private SVGView svgView; 
    private ViewListener viewListener; 
    private ViewState viewState; 
    private SVG svg; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     svgView = (SVGView)findViewById(R.id.svgview); 
     viewListener = new ViewListener(); 
     viewState = new ViewState(); 

     svgView.setViewState(viewState); 
     svgView.setOnTouchListener(viewListener); 
     viewListener.setViewState(viewState); 

     svg = SVGParser.getSVGFromResource(getResources(), R.drawable.android); 
     svgView.setImageDrawable(svg.createPictureDrawable()); 
     svgView.setBackgroundColor(Color.WHITE); 

    } 
} 

SVGView.java

package android.svgview; 

import java.util.Observable; 
import java.util.Observer; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.widget.ImageView; 

public class SVGView extends ImageView implements Observer { 

    private ViewState viewState; 

    public SVGView(Context context) { 
     super(context); 
    } 

    public void setViewState(ViewState viewState){ 
     if(this.viewState==null){ 
      this.viewState = viewState; 
      this.viewState.addObserver(this); 
     } 
    } 

    protected void onDraw(Canvas canvas){ 

     canvas.scale(1.0f, 1.0f); 
     canvas.translate(viewState.getX(), viewState.getY()); 

     super.onDraw(canvas); 

    } 
    public void update(Observable observable, Object data) { 
     invalidate(); 

    } 
} 

和main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <android.svgview.SVGView 
     android:id="@+id/svgview" 
     /> 
</LinearLayout> 

當我改變svgView = (SVGView)findViewById(R.id.svgview);svgView = new SVGView(this);然後setContentView(R.layout.main);setContentView(svgView);一切工作正常。但是使用main.xml會導致錯誤。

我嘗試清理並重新編譯項目,將其編譯爲新的Eclipse安裝包,但沒有任何更新。我不知道在哪裏出了問題: -/

+1

請附上您收到的錯誤 - 理想來回堆棧跟蹤m logcat。 –

回答

8

你可能需要在你的SVGView.java提供此構造器:

public SVGView(Context context AttributeSet atrs) { 
    super(context, atrs); 
} 

然後在你的XML文件更改聲明如下:

<android.svgview.SVGView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/svgview" /> 
+0

非常感謝,現在一切順利。你可以請我解釋一下,爲什麼這個構造函數的公共SVGView(上下文上下文AttributeSet atrs)超級(上下文,atrs); } 解決了我的問題? :) – user1044445

+0

'AttributeSet'參數包含像XML文件中提供的witdh和height之類的東西。這是通過xml添加窗口小部件時要調用的窗口。我也可以通過在構造函數中爲SVGView設置LayoutParams來解決這個問題。 (如果我的答案解決了你的問題,請接受它作爲答案。) – kaspermoerch

0

附加構造

public SVGView(Context context, AttribeSet attributeSer) 
{ 
     super(context, attributeSet); 
    } 
+0

非常感謝,現在一切都運行良好。你可以請我解釋一下,爲什麼這個構造函數的公共SVGView(上下文上下文AttributeSet atrs)超級(上下文,atrs); } 解決了我的問題? :) – user1044445

+0

,因爲當我們添加布局的任何部件時,它會調用frameWork的相關java類與構造函數(上下文,AttributeSet),其中attributeSet幫助讀取寬度,高度,背景等所有屬性。例如按鈕將調用Button.java。 –

相關問題