繁体   English   中英

长按带有SpannableString的TextView时发生NullPointerException

[英]NullPointerException when long press on TextView with SpannableString

我有一个带有SpannableString的TextView,因为当用户单击视图的不同位置时,我想做不同的事情。 这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv = new TextView(this);
    String str = "ClickMe";
    SpannableString spStr = new SpannableString(str);
    ClickableSpan clickSpan = new CustomizedClickableSpan(str);
    spStr.setSpan(clickSpan, 0, str.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    tv.setText("PlainTextA");
    tv.append(spStr);
    tv.append("PlainTextB");
    tv.setMovementMethod(LinkMovementMethod.getInstance());

    setContentView(tv);
}

private class CustomizedClickableSpan extends ClickableSpan {
    String text;

    public CustomizedClickableSpan(String text) {
        super();
        this.text = text;
    }

    @Override
    public void onClick(View widget) {
        Toast.makeText(SpanTextView.this, text, Toast.LENGTH_SHORT).show();
    }

}

之后,textView的文本为“ PlainTextAClickMePlainTextB”。 当我单击“ ClickMe”时,将显示吐司。 (很好)

但是,当我长按“ ClickMe”时,该应用程序崩溃了! 这是我的日志:

java.lang.NullPointerException
at android.widget.Editor.touchPositionIsInSelection(Editor.java:750)
at android.widget.Editor.performLongClick(Editor.java:851)
at android.widget.TextView.performLongClick(TextView.java:8390)
at android.view.View$CheckForLongPress.run(View.java:18419)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5050)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)

有人可以帮助我吗? 非常感谢!

编辑
感谢@Blackbelt。 我只添加以下代码:

tv.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        //just consume the event
        return true;
    }
});

问题就解决了!
顺便说一句, NullPointerException的原因是什么?

与解决方案setOnLongClickListener有一个副作用: LinkMovementMethod.onTouchEvent不会得到MotionEvent.ACTION_UP 为避免此问题,您可以改为调用TextView.setLongClickable(false) setMovementMethod之后调用setLongClickable很重要,因为setMovementMethod在内部调用setLongClickable(true)

您必须添加一种方法来捕获longClick事件。 在这种情况下,如果要控制TextView

tv.setOnLongClickListener(new View.OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {

        Toast.makeText(HomeSafeActivity.this, "Long preess", Toast.LENGTH_LONG).show();

        return true;
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM