6

アンカーを含むhtml文字列を含むテキストビューがあります。テキストビューをクリックすると、たとえばAというメソッドを呼び出し、テキストビュー内のリンクをクリックすると、Bというメソッドを呼び出します。これは機能しましたが、問題が発生しました:リンクをクリックすると、メソッドB が呼び出されますが、メソッド A も呼び出されます。リンクをクリックしたときにメソッド B と A ではなく、メソッド B のみが呼び出されるようにするにはどうすればよいですか?

私のコード:

for (int i = 0; i < ingevoegd.length(); i++) {
        JSONObject soortingevoegd = ingevoegd.getJSONObject(i);
        String type = soortingevoegd.getString("type");         
        if (type.equals("Vis")) {
            String link = "<a href = 'com.aquariumzoeken.pro://Soortweergave?selected="
                    + naam + "&type=Vis" + "'>" + naam + "</a>";
            text = text.replaceAll(naam, link);
        }
    }

    TextView texttv = (TextView) v.findViewById(R.id.textviewer);   


    texttv.setText(Html.fromHtml(text));
    texttv.setMovementMethod(LinkMovementMethod.getInstance());

そして、テキストビュー onclicklistener:

texttv.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            try {

                switchToEditMode sw = new switchToEditMode();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });

前もって感謝します、サイモン

4

4 に答える 4

6

ここで述べたように onClickListener を変更してみてください:自動リンクが有効なテキストビューで onclicklistener を制御する

texttv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                             if(texttv.getSelectionStart()==-1&&texttv.getSelectionEnd()==-1){ 

                       // Method B

                             }

                    }
                });

基本的に、リンクの開始と終了の場所とタイミングを確認し、ハイパーリンクを超えていない場合にのみメソッド B を呼び出します。それ以外の場合は、とにかくリンクで A を起動します

ドキュメントはこちら: http://developer.android.com/reference/android/text/Selection.html#getSelectionEnd(java.lang.CharSequence)

于 2013-07-20T16:18:23.720 に答える
0

ソース コードを調べた結果、これを行う良い方法はないと結論付けましたが、おそらく最善の選択はカスタムの移動方法です。このようなもの:

class MyMovementMethod extends LinkMovementMethod { 

    // Most of this code copied from LinkMovementMethod
    @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);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    link[0].onClick(widget);
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer,
                                       buffer.getSpanStart(link[0]),
                                       buffer.getSpanEnd(link[0]));
                }
                return true;
            } else {
                Selection.removeSelection(buffer);
                // NEW CODE - call method B
                B();
            }
        }

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

}

次に、 を呼び出す代わりにLinkMovementMethod.getInstance()、代わりに を作成しMyMovementMethodます。

于 2013-07-20T16:50:07.767 に答える