2

Ok。これらは私の問題です。

  1. 正規表現を使用して、文字以外のすべてを切り出してから、見つかった単語を $word タグ内に入れる必要があります。これで str = str.replaceAll(pattern, "$0");. 現在、すべての適切な要素(句読点、数字など)をフィルタリングしていますが、単語ではなくタグ内の各単語内のすべての文字を囲んでいます。では、正規表現を使用して文字を単語にグループ化するにはどうすればよいでしょうか?

from "(タグオープン)t(クローズ)(タグオープン)h(クローズ)(タグオープン)i(クローズ)(タグオープン)s(クローズ)(タグオープン)i(a close)(タグオープン)s(クローズ)(タグオープン)w(クローズ)(タグオープン)r(クローズ)(タグオープン)o(クローズ)(タグオープン)n(a close)(タグを開く)g(閉じる)";

に :

"(タグを開く)これ(閉じる) (タグを開く)は(閉じる) (タグを開く)正しい(閉じる)";

次に、それらをクリック可能にしています。クリック イベントをキャッチして、クリックされた単語の画面上の位置を取得する必要があります。クリック イベントを使用して、クリックされた単語のすぐ下にツール ヒントを表示させたいからです。ご協力ありがとうございました。

public class MainActivity extends Activity {

public String text = "This is just a sentence to test you. 23 this is another number23!g?";
public TextView tv;

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

    setContentView(R.layout.activity_main);

    text = explode(text);

    tv = (TextView) findViewById(R.id.tv1);

    tv.setLinksClickable(true);
    tv.setMovementMethod(LinkMovementMethod.getInstance());

    Spanned article = Html.fromHtml(text, null, null);
    setHTML(article);
}


public void setHTML(Spanned html) {
      SpannableString message = new SpannableString(html.toString());
      Object[] spans = html.getSpans(0, html.length(), Object.class);
      for (Object span : spans) {
         int start = html.getSpanStart(span);
         int end = html.getSpanEnd(span);
         int flags = html.getSpanFlags(span);
         if (span instanceof URLSpan) {
            URLSpan urlSpan = (URLSpan) span;
            span = new CallbackSpan(urlSpan.getURL());
         }
         message.setSpan(span, start, end, flags);
      }
      tv.setText(message);
   }
    public String explode(String str){  
      String pattern = "([a-zA-Z])";
      str = str.replaceAll(pattern, "<a href=\"$0\">$0</a>");
      return str;
    }

   private final class CallbackSpan extends ClickableSpan {

      private String m_data;
      private String url_main;

      public CallbackSpan(String url) {
         m_data = url.substring(0);
         url_main = url;

      }

      public void onClick(View view) {

          TextView item = (TextView)findViewById(R.id.tv2);
          item.setText(url_main + " was clicked.");
          Log.d("item", url_main);
      }
   }

}

4

2 に答える 2

8

最新のコード、pls はリンク フォーム githubを参照してください。

message.setSpan(span, start, end, flags);

新しいスパンを設定する前に元のスパンを削除する必要があります。以下を参照してください
ClickableSpan の onClick() が URLSpan で機能しませんか?

EDITによって任意のスパンクリックイベント
をキャプチャできますextends LinkMovementMethod

    import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class LinkMovementMethodExt extends LinkMovementMethod {
    public static final int LinkMovementMethod_Down = 1001;
    public static final int LinkMovementMethod_Up = 2002;
    private static LinkMovementMethod sInstance;
    private Class mSpanClass = null;
    private WeakReference<Handler> mWeakReference = null;

    public static MovementMethod getInstance(Handler handler, Class spanClass) {
        if (sInstance == null) {
            sInstance = new LinkMovementMethodExt();
            ((LinkMovementMethodExt) sInstance).mWeakReference = new WeakReference<>(handler);
            ((LinkMovementMethodExt) sInstance).mSpanClass = spanClass;
        }
        return sInstance;
    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer,
                                MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);
            /**
             * get you interest span
             */
            Object[] spans = buffer.getSpans(off, off, mSpanClass);
            if (spans.length != 0) {
                if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(spans[0]), buffer.getSpanEnd(spans[0]));
                    MessageSpan obj = new MessageSpan();
                    obj.setObj(spans);
                    obj.setView(widget);
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Down;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                } else if (action == MotionEvent.ACTION_UP) {
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        MessageSpan obj = new MessageSpan();
                        obj.setView(widget);
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Up;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                }
            }
        }

        return super.onTouchEvent(widget, buffer, event);
    }

    public boolean canSelectArbitrarily() {
        return true;
    }

    public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode,
                           KeyEvent event) {
        return false;
    }

textView.setMovementMethod(LinkMovementMethodExt.getInstance());


「アンドロイド開発者」向けに編集LinkMovementMethodExtクラスのHandlerプロパティ
を追加する方が良い方法です。 Message オブジェクトとして配信されるすべての Spanned をキャプチャできます。 onTouchEvent メソッドのコードを切り取ります。



Message message = Handler.obtainMessage();
message.obj = buffer.getSpans(off, off, Spanned.class);//get all spanned
message.what = 111;//which value ,it is up to you
message.sendToTarget(); //send message to you target handler

ハンドラークラスでスパンされると予想されるハンドラーを処理できます。扱い方が柔軟なのかもしれません。
お役に立てれば幸いです。


ここに画像の説明を入力


上記のテキストビューのテキストは<a href='/a'>aaaa</a>123456<a href='/b'>bbbb</b>7890
、要件を理解しています:
Click 'aaaa',you want to get it s href value '/a', click 'bbbb',get its href '/b'; Web ブラウザーで開かれる既定のアクションをトリガーしません。
私の理解が正しければ、次のようにすることができます:

  • テキストビューなどの LinkMovementMethod を設定します。textview.setMovementMethod(LinkMovementMethodExt.getInstance(handler, URLSpan.class));
  • インタレスト スパンを取得します。これが URLSpan です。
    ハンドラーhandleMessageメソッドでは、次のように実行できます。
private Handler handler = new Handler() {
      public void handleMessage(Message msg) {
          int what = msg.what;
          if (what == 100) {
              Object[] spans = (Object[])msg.obj;
              for (Object span : spans) {
                  if (span instanceof URLSpan) {
                      System.out.println(((URLSpan) span).getURL());
                  }
              }
          }
      };
  };

デモコードをダウンロード

  • MainActivityにはcolorプロパティがあり、好きな色の値を割り当てることができます。

実行する方法?

  • Step1、現在のクリックスパンを取得します。

  • Step2、現在のクリックスパンに BackgroundColorSpan を設定します

于 2013-04-24T02:42:57.147 に答える
0

テキストビューで個々の単語をクリックしたいとしますか? コメントのすべての文字を単語に変換する方法がわかりません。

以下は、個々の作品をクリックしてトーストに表示するために使用できます。

    public class MainActivity extends Activity {

    TextView _tv;
    String[] each;
    SpannableString ss1;
    Button b;
    EditText et;
    String s;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b= (Button) findViewById(R.id.button1);
    et = (EditText) findViewById(R.id.ed);
    _tv = (TextView) findViewById( R.id.tv );
    b.setOnClickListener(new OnClickListener()
    {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        s=et.getText().toString();
        _tv.setText("");
        for(int i=0;i<s.length();i++)
        {
            each = s.split("\\s+");
        }
        for(int i=0;i<each.length;i++)
        {
            System.out.println("................"+each[i]);
            ss1=  new SpannableString(each[i]);
            //StyleSpan boldSpan = new StyleSpan( Typeface.BOLD );
            //spannable.setSpan( boldSpan, 41, 52, Spannable.SPAN_INCLUSIVE_INCLUSIVE );
            ss1.setSpan(new MyClickableSpan(each[i]), 0, ss1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            _tv.append(ss1); 
            _tv.append(" "); 

        }
        _tv.setMovementMethod(LinkMovementMethod.getInstance());
    }
       });
      }
      class MyClickableSpan extends ClickableSpan{ 
      String clicked;
          public MyClickableSpan(String string) {
    // TODO Auto-generated constructor stub
       clicked =string;
      }
      //clickable span
      public void onClick(View textView) {
      //do something


      Toast.makeText(MainActivity.this,clicked ,
        Toast.LENGTH_SHORT).show();
     }
     @Override
     public void updateDrawState(TextPaint ds) {
     ds.setColor(Color.BLACK);//set text color 
     ds.setUnderlineText(false); // set to false to remove underline
     }
    }
    }
于 2013-03-29T08:36:50.097 に答える