传递可见类的额外参数?

时间:2016-05-07 20:11:26

标签: java android xml constructor

我正在尝试定义一个类似的类,所以我可以用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;

我希望能够通过构造函数设置mSomeInt所以我不仅要将mContext设置为context,还要将mSomeInt设置为我传递的某个整数in。我使用整数作为例子,但技术上可以是任何参数。

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

  

所以当我定义这个对象时,我正在做:

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

此处,虽然您要分配mChart变量,但您没有创建MyLineChart对象,而只是将已创建的对象分配给mChart

如果在某个xml文件中定义(就像我认为你已经完成的那样),那么你的类将由Android创建,使用以下构造函数:

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

您可以从xml传入属性,您可以在其中解析attrs以提取其值。如果您尝试传入常量值(例如视图的颜色或某个默认值),请参阅this guide,了解如何在视图中使用自定义属性。

如果您希望设置一些在运行时只知道的值,您可以:

  1. 使用setter

    我推荐这种方法。只需向MyLineChart添加方法

    void setMyValue(int myValue) {
      mMyValue = myValue;
      //notify parts of the view that this property has changed
      ...
    }
    
  2. 以编程方式创建对象。

    这里你没有在xml中包含视图,而是以编程方式创建它来替换

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

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

    为此,您可以为MyLineChart创建一个新的构造函数,类似于

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