从另一个java类中覆盖此类中的方法(附加到其他方法)

时间:2018-03-09 15:32:22

标签: java android textview spannable

我想从另一个班级为ClickableSpan设置TextView。在ClickableSpan我需要覆盖两个方法updateDrawState()onClick()。前一种方法对于所有TextViews都是相同的,但后者onClick()对于任何TextView都是不同的。所以我只想写一次updateDrawState()方法(在 Commons class 中),而不是任何TextView。我怎样才能做到这一点?

以下代码块清楚地解释了我想要的内容:

public class Commons {
    ...
    public void makeSpannable(TextView tv, String text, int startIndex, int endIndex, ClickableSpan appendClickableSpan) {
        SpannableString span = new SpannableString(text);
        span.setSpan({
        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(ContextCompat.getColor(Activation.this, R.color.textViewClickable));
            ds.setUnderlineText(false);

            appendClickableSpan;

        }}, startIndex, endIndex, 0);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        tv.setText(span, TextView.BufferType.SPANNABLE);
    }
    ...
}

public class Main {
    ...
    TextView textView = findViewById(R.id.textView1);
    String text = "some sample text";
    new Commons().makeSpannable(textView, text, 2, 6, new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            if (validator.checkValidation(tilCode)) ResendActivationEmail();
        }
    });
    ...
}

1 个答案:

答案 0 :(得分:3)

我不确定,如果我理解正确的话,但您可能想要创建updateDrawState方法的常规实现以及onClick的几个方法。

您可以通过在扩展ClickableSpan的位置创建抽象类来实现此目的,并且只实现updateDrawState,如下所示:

public abstract class MyClickableSpan extends ClickableSpan {
    @Override
    public void updateDrawState(TextPaint ds) {
        // Your custom implementation
    }
}

然后像这样使用它:

ClickableSpan clickableSpan = new MyClickableSpan() {
    @Override
    public void onClick(View widget) {
        // Your custom implementation
    }
};

如果你坚持Commons课,我可能会把方法设为静态:

public class Commons {
    public static void makeTextViewSpannable(TextView tv, String text, int startIndex, int endIndex, MyClickableSpan span) {
        SpannableString spannableString = new SpannableString(text);
        spannableString.setSpan(span, startIndex, endIndex, 0);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        tv.setText(spannableString, TextView.BufferType.SPANNABLE);
    }
}

用法:

Commons.makeTextViewSpannable(textView, text, startIndex, endIndex, new MyClickableSpan() {
    @Override
    public void onClick(View widget) {
        // Your custom implementation
    }
});