0

基本的に私はこのような段落を持っています

伝導帯$ecの下部エネルギー 準位と価電子帯$evの上部エネルギー準位の差は、エネルギー バンド ギャップと呼ばれます。

今、テキストを解析して、$ プレフィックス付きの記号を取得し、それらを数式である小さな PNG 画像に置き換えようとしています。これらは、Ev や Ec のような 1 文字/2 文字の定数記号です。それらは私の資産フォルダーにあります。基本的にこれはコードです

public SpannableStringBuilder getConstants(String desc, String constpath){
    SpannableStringBuilder builder = new SpannableStringBuilder();
    if (desc.contains("$")){
        Matcher matcher = Pattern.compile("\\$\\w+").matcher(desc);
        int lastEnding=0;
        while (matcher.find()) {
            String constName = matcher.group();
            constName = constName.substring(1,constName.length());
            int startIndex = matcher.start();
            int endIndex = matcher.end();
            String brokenDescFirstPart = desc.substring(lastEnding, startIndex - 1);
            lastEnding = endIndex+1;
            builder.append(brokenDescFirstPart).append("   ");
            try{
                InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
                Drawable dconstImg = Drawable.createFromStream(imgStream, null);
                imgStream.close();
                builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append("  ");
            }catch (Exception e){
                builder.append(" ");
            }
        }
        String brokenDescLastPart = desc.substring(lastEnding, desc.length() - 1);
        builder.append(brokenDescLastPart);
    }else{
        builder = SpannableStringBuilder.valueOf(desc);
    }

    return builder;
}

コードの簡単な要約は、descが解析したい文字列であることです。次に、regex を使用して $word パターンを取得し、matcher.matchメソッドを使用してテキストを反復処理します。いくつかの int 変数を使用して、それらのシンボル間の開始点と終了点を追跡し、画像が埋め込まれた元の文字列を慎重に再構築します。今コード

try{
                InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
                Drawable dconstImg = Drawable.createFromStream(imgStream, null);
                imgStream.close();
                builder.setSpan(new ImageSpan(dconstImg,ImageSpan.ALIGN_BOTTOM), builder.length() -3, builder.length() -1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append("  ");
            }catch (Exception e){
                builder.append(" ");
            }

私の質問の核心です。この問題に関する他の質問から入手しました。彼らはそれが機能すると言いました。しかし、それは私のものではありません。コード全体にブレークポイントを設定し、1 行ずつ実行しました。エラーは何もありません。それでもうまくいきません。

テキストは、画像を挿入したはずの場所を特定するために意図的に使用した textview の余分なスペースで読み込まれます。My TextView は、Android Studio の Small Text View ウィジェットです。

4

3 に答える 3

0

フォローしてみて、

ImageSpan is = new ImageSpan(context, R.id.icon);
text.setSpan(is, index, index + strLength, 0);

このコード index = your $ start position. インデックス + strLength = $ 終了位置。

于 2015-09-30T05:06:42.047 に答える
0

setCompundDrawblesWithIntrinsicBounds を使用できるのに、スパン可能なテキストはなぜですか? 段落を分割し、一意の ID を添付します。以下の例;

InputStream imgStream = getContext().getAssets().open(constpath+constName+".png");
Drawable dconstImg = Drawable.createFromStream(imgStream, null);    
if ( Build.VERSION.SDK_INT >= 21 )
{
    text_you_want_to_add_drawable_to.setCompoundDrawablesWithIntrinsicBounds( dconstImg, null ), null, null, null );
} else
{
    text_you_want_to_add_drawable_to.setCompoundDrawablesWithIntrinsicBounds( dconstImg, null, null, null );
}
于 2015-09-29T12:33:30.883 に答える