2016-05-07 97 views
1

我試圖定義像這樣一類的,這樣我就可以有它在XML顯示:傳遞可見類的額外參數?

public class MyLineChart extends com.github.mikephil.charting.charts.LineChart { 
    private Context mContext; 

    public MyLineChart(Context context) { 
     super(context); 
     mContext = context; 
    } 

    public MyLineChart(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
    } 

    public LineChart(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mContext = context; 
    } 

    // ... 
} 

所以,當我定義這個對象我這樣做:

mChart = (MyLineChart) findViewById(R.id.line_chart); 

但如果我想通過構造函數發送其他參數?例如說,MyLineChart類有另一個領域:

private int mSomeInt;

,我希望能夠通過構造函數,所以我不只是設置mContextcontextmSomeInt一些整數我通過設置mSomeInt我使用整數作爲例子,但它在技術上可以是任何參數。

可以這樣做嗎?

+0

檢查此問題http://stackoverflow.com/questions/37071725/pass-data-from-activity-to-fragment-class-cast-exception/37072002#37072002 – Stallion

回答

1

所以,當我定義這個對象我這樣做:

mChart = (MyLineChart) findViewById(R.id.line_chart); 

在這裏,即使你是分配mChart變量,你沒有創建一個MyLineChart對象,你只是分配一個已經創建的對象mChart

如果一些XML文件中定義的(就像我認爲你這樣做),那麼你的類將搭載Android創建,使用下面的構造:

public MyLineChart(Context context, AttributeSet attrs) { 
... 
} 

你可以在屬性傳遞從XML,在那裏你會解析attrs以提取其值。有關如何在視圖中使用自定義屬性,請參閱this guide,如果您嘗試傳遞常量值(例如視圖的顏色或某個默認值)。

相反,如果你要設置一定的價值,你只知道在運行時,您可以:

  1. 使用二傳手

    我推薦這種方法。只需添加一個方法來MyLineChart

    void setMyValue(int myValue) { 
        mMyValue = myValue; 
        //notify parts of the view that this property has changed 
        ... 
    } 
    
  2. 編程創建對象。

    在這裏,你不包括XML的觀點,而是創建編程與

    mChart = new MyLineChart(context, myValue); 
    //code that adds the view to the layout like a LinearLayout etc. 
    ... 
    

    對於這種更換

    mChart = (MyLineChart) findViewById(R.id.line_chart); 
    

    工作,你將創建一個新的構造爲MyLineChart,像

    public MyLineChart(Context context, int myValue) { 
        super(context); 
        mContext = context; 
        mMyValue = myValue; 
    }