6

私は市場から次のバグレポートを受け取り続けています。

java.lang.StringIndexOutOfBoundsException: length=51; regionStart=37; regionLength=-15 at
java.lang.String.startEndAndLength(String.java:593) at
java.lang.String.getChars(String.java:902) at
android.text.SpannableStringInternal.getChars(SpannableStringInternal.java:70)
at android.text.TextUtils.getChars(TextUtils.java:70) at
android.text.TextLine.set(TextLine.java:160) at
android.text.Layout.draw(Layout.java:424) at
android.widget.TextView.onDraw(TextView.java:5262) at
android.view.View.draw(View.java:11184) at
android.view.ViewGroup.drawChild(ViewGroup.java:2892) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.widget.ListView.drawChild(ListView.java:3231) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.widget.AbsListView.dispatchDraw(AbsListView.java:2277) at
android.widget.ListView.dispatchDraw(ListView.java:3226) at
android.view.View.draw(View.java:11289) at
android.widget.AbsListView.draw(AbsListView.java:3760) at
android.view.ViewGroup.drawChild(ViewGroup.java:2892) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.ViewGroup.drawChild(ViewGroup.java:2890) at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:2494) at
android.view.View.draw(View.java:11187) at
android.widget.FrameLayout.draw(FrameLayout.java:450) at
com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2291)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2210) at
android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1816) at
android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628) at
android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:137) at
android.app.ActivityThread.main(ActivityThread.java:4511) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:511) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) at
dalvik.system.NativeStart.main(Native Method)

苛立たしい部分は、これがandroid自体の内部から発生していることです-そして私のコードに出発点がありません。いくつかの調査を行った後、これはヘブライ語のユーザーにのみ発生し、Googleのバグへのこのリンクを見つけました-http://code.google.com/p/android/issues/detail?id= 30889

私は当然、このバグに割り当てられたライターとGoogleの従業員に連絡しようとしましたが、誰もカーテシーや返信を持っていません。

スパンを設定する私の関連コードは次のとおりです。

if(searchTerm!=null){
    try{
        Spannable str = (Spannable) name.getText();
        int s_ind = fi.getSearchName().indexOf(searchTerm);
        str.setSpan(new ForegroundColorSpan(Color.BLACK),s_ind, (s_ind+searchTerm.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        str.setSpan(new BackgroundColorSpan(Color.YELLOW),s_ind, (s_ind+searchTerm.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD),s_ind, (s_ind+searchTerm.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }catch(Exception ex){
        FLogger.logE(DW_CODES.PREDEFINED_ERROR, "Exception while searching for view in predefined "+ex.getMessage());
    }
}

検索語は名前の一部です。searchTermの部分を別の色でマークして、ユーザーに見やすくしたいと思います。

私はこれに本当に多くの時間を費やしました、そして私は私の4つのテストデバイスと8つのAVDでそれを再現することさえできなかったので私はちょっと迷っています。Spannablesなしで同じことをするためのヒント\提案は大歓迎です。

4

3 に答える 3

3

ヘブライ語は右から左への言語です。少なくとも 2.3 までの Android では、右から左への処理がうまくいきませんでした。たとえば、canvas.drawText は逆方向に描画します。影響を受ける地域 (イスラエル、中東、その他のいくつかの国) に向かう電話でさまざまな OEM によって使用された非公式のパッチがありましたが、それは普遍的ではありません。通常、これらのパッチが適用されていない電話が右から左へのテキストを行う言語で使用された場合に、エラーが見られました。Google が公式のパッチをリリースしたかどうかはわかりませんが、リリースしたことは確かですが、壊れた 2.3 の電話が何千万台も出回っています。

ここに問題があります。自分で修正しようとすると (通常は自分でテキストを逆にすることでした)、これらのパッチが適用されたデバイスでは機能しません。これらは、これらの言語を使用する電話の大部分です。だから提案できない。rtl 言語ではこの効果をオフにして、それが修正されるかどうかを確認することをお勧めします。これは、ヘブライ語、アラビア語、およびウルドゥー語です。

于 2013-01-12T22:16:51.847 に答える
0

試しadb logcat -s DEBUGてみてください。ネイティブクラッシュが発生する可能性がありますStringIndexOutOfBoundsException

于 2013-11-22T12:39:58.380 に答える
0

代替手段を試しましたか?たとえば、これ:

String str = name.getText().toString();
int s_ind = fi.getSearchName().indexOf(searchTerm);
String prefix = str.substring(0, s_ind);
String toBold = str.substring(s_ind, searchTerm.length());
String postfix = str.substring(searchTerm.length(), str.length());
Spanned spanned = Html.fromHtml(prefix + "<b>" + toBold + "</b>"
                + postfix);

コードの端が荒いことは知っていますが、アイデアはわかります。サポートされている html タグのリストをご覧ください。

于 2013-11-22T05:56:11.307 に答える