Скопируйте Конструктора и конструктора по умолчанию

Я хотел использовать ответ @PedroBarros, но определив, каким должен быть интервал в пикселях.

Вот мое редактирование метода applySpacing:

private void applySpacing() {
    if (this == null || this.originalText == null) return;

    Paint testPaint = new Paint();
    testPaint.set(this.getPaint());
    float spaceOriginalSize = testPaint.measureText("\u00A0");
    float spaceScaleXFactor = ( spaceOriginalSize > 0 ? spacing/spaceOriginalSize : 1);

    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < originalText.length(); i++) {
        builder.append(originalText.charAt(i));
        if(i+1 < originalText.length()) {
            builder.append("\u00A0");
        }
    }
    SpannableString finalText = new SpannableString(builder.toString());
    if(builder.toString().length() > 1) {
        for(int i = 1; i < builder.toString().length(); i+=2) {
            finalText.setSpan(new ScaleXSpan(spaceScaleXFactor), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    super.setText(finalText, BufferType.SPANNABLE);
}

Я новичок в качестве разработчика Android, пожалуйста, не стесняйтесь, дайте мне знать, если это не хорошо!

14
задан Andry 4 November 2014 в 20:50
поделиться

3 ответа

Да. Как только вы явно объявляете абсолютно любой конструктор для класса, компилятор перестает предоставлять неявный конструктор по умолчанию. Если вам по-прежнему нужен конструктор по умолчанию, вы должны явно объявить и определить его сами.

PS Можно написать конструктор копирования (или конструктор преобразования, или любой другой конструктор), который также будет по умолчанию конструктор. Если ваш новый конструктор попадает в эту категорию, там '

33
ответ дан 1 December 2019 в 07:19
поделиться

Как сказал AndreyT, если вы явно объявляете какой-либо конструктор, включая конструктор копирования, компилятор не будет неявно объявлять или определять конструктор по умолчанию.

Это не всегда проблема.

Если вы не хотите, чтобы ваш класс был конструктивным по умолчанию, то совершенно нормально не объявлять конструктор по умолчанию. Но если вы хотите, чтобы он был конструктивным по умолчанию (например, если вы хотите раскомментировать строку X x1; в своем примере), тогда вы должны объявить и определить конструктор по умолчанию.

Также обратите внимание что конструктор по умолчанию - это любой конструктор, который может быть вызван без аргументов, а не просто конструктор без аргументов. X :: X (int = 5) - отличный конструктор по умолчанию.

1
ответ дан 1 December 2019 в 07:19
поделиться

Вы не Я должен определить оба. Однако, как только вы определите какие-либо конструкторы для класса, все конструкторы по умолчанию станут недоступны. Итак - если вы хотите как копировать-конструировать, так и конструировать без копирования, вам необходимо также определить конструктор по умолчанию (т.е. явный), отличный от заданного по умолчанию (т.е. без параметров).

Если вы определяете конструктор копирования, вы должны обычно также переопределить оператор присваивания.

3
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: