2016-05-07 2 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;

, и я хотел бы быть в состоянии установить mSomeInt через конструктор, так что я не просто заходящий mContext к context, но и 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 = (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; 
    } 
    
Смежные вопросы