2015-05-05 2 views
1

У меня есть TextView с SpannableString, потому что я хочу, чтобы сделать differnet-вещь, когда пользователь щелкает другую позицию представления. Вот мой код:NullPointerException при длительном нажатии на TextView с SpannableString

@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) 

Любой человек может мне помочь? Большое спасибо!

EDIT:
Спасибо за @Blackbelt. Я просто добавлю этот код:

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

И проблема решена!
BTW, в чем причина NullPointerException?

+0

ли это отключение жестов * Long Press * для вас? – Blackbelt

+0

@Blackbelt я не думаю: * Я хочу сделать differnet вещь, когда пользователь нажимает * –

+0

У меня такая же проблема. Я мог бы исправить это, установив шрифт представления (Editext/Textview) программным способом вместо XML. Обратите внимание, что для меня это происходило только на Lollipop версиях Samsung, о которых сообщают краштитики. –

ответ

0

Вы должны добавить метод, чтобы поймать событие 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; 
    } 
}); 
+0

Это не работает. И у суперкласса ClickableSpan нет метода onLongClick. – hanswim

+0

Я знаю, поэтому он не был аннотирован с '@ Override', проверьте мое обновление –

+1

Это работает! Большое спасибо. На самом деле мне не нужен длинный клик, я просто хочу избежать краха. – hanswim

1

Решение с setOnLongClickListener имеет один побочный эффект: LinkMovementMethod.onTouchEvent не получит MotionEvent.ACTION_UP. Чтобы избежать этой проблемы, вы можете позвонить по телефону TextView.setLongClickable(false). Важно позвонить setLongClickable после setMovementMethod, потому что setMovementMethod звонки setLongClickable(true) внутри.

+0

Это должен быть комментарий к ответу, на который вы ссылаетесь. – Blackwood

+0

У меня такая же проблема. Я мог бы исправить это, установив шрифт вида (Editext/Textview) программным способом вместо XML. Обратите внимание, что для меня это происходило только в версиях Samsung Lollipop, о которых сообщалось крахлитиками. –

Смежные вопросы