2015-05-05 22 views
1

我有一個帶有SpannableString的TextView,因爲我想在用戶點擊視圖的不同位置時做不同的事情。這是我的代碼: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) 

任何人都可以幫我嗎?非常感謝!

編輯
感謝@Blackbelt。我只是添加這些代碼:

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

並且問題解決了!
順便說一下,NullPointerException的原因是什麼?

+0

它是否禁用*長按*手勢爲你的可能性? – Blackbelt

+0

@Blackbelt我猜不是:*我想在用戶點擊時做不同的事情* –

+0

我得到了同樣的問題。我可以通過以編程方式設置視圖字體(Editext/Textview)來解決此問題,而不是XML。請注意,對於我它只發生在crashlytics報道的三星棒棒糖版本上。 –

回答

0

您必須添加一個方法來捕獲longClick事件。在這種情況下,如果要控制TextView

setOnLongClickListener
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

我知道,這就是爲什麼它沒有用@覆蓋標註,檢查我的更新 –

+1

它的工作原理!非常感謝你。其實我不需要長時間點擊事件,我只是想避免崩潰。 – hanswim

1

解決方案有一個副作用:LinkMovementMethod.onTouchEvent不會得到MotionEvent.ACTION_UP。 爲避免此問題,您可以撥打TextView.setLongClickable(false)來代替。 setMovementMethod之後請致電setLongClickable,因爲setMovementMethod內部調用setLongClickable(true)

+0

這應該是對你所指的答案的評論。 – Blackwood

+0

我得到了同樣的問題。我可以通過以編程方式設置視圖字體(Editext/Textview)而不是XML。請注意,對我來說,它只發生在crashlytics報告的三星棒棒糖版本上。 –

相關問題