3

setMovementMethod(LinkMovementMethod.getInstance())Android アプリの EditText ビューに使用しています。EditText 内のリンクは正常に機能しますが、状況によっては、このメソッドをプログラムで無効にする必要があります (longClick メニューでコピー項目を有効にするため)。どうやってするの?「removeMovementMethod()」のようなものが必要です。

手伝って頂けますか?

ありがとうございました!

4

6 に答える 6

2

setMovementMethod(null)longClickメニューの後、無効になります。したがって、この方法を使用することをお勧めします。

setMovementMethod(ArrowKeyMovementMethod.getInstance())
于 2012-05-14T18:35:21.627 に答える
0

@lubartが回答の1つでコメントしたように、 setMovementMethod(null) を設定しても機能しません。LinkMovementMethod を設定する前に以前の MovementMethod を保存し、LinkMovementMethod を使用したくない場合は再度復元する必要があります。

強調したい重要な点の 1 つは、以前の MovementMethod に復元するときに AutoLinkMask=0 を設定する必要があることです。そうしないと、リンクが消えず、キャレットが表示されず、コピー/貼り付けのコンテキスト メニューが表示されません。

また、setMovementMethod を使用した後、移動方法を適用するために、EditText/TextView でテキストを再設定します。

アルゴリズム (コードではありません):

リンクの移動方法を設定するには -

previousMovementMethod = editText.MovementMethod;

editText.autoLinkMask = All;
editText.MovementMethod = LinkMovementMethod.GetInstance();
editText.SetText(editText.GetText());

リンク移動方法を削除するには -

editText.autoLinkMask = 0;
editText.MovementMethod = previousMovementMethod;
editText.SetText(editText.GetText());
于 2014-03-12T11:04:37.867 に答える
0

試してみてください:- このクラスをプロジェクトに追加してください

import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.ClickableSpan;
import android.view.MotionEvent;
import android.widget.TextView;

/**
 * Created by Nishu on 20-08-2015.
 */
public class MyMovementMethod extends ArrowKeyMovementMethod {

private static MyMovementMethod sInstance;

public static MovementMethod getInstance() {
if (sInstance == null) {
    sInstance = new MyMovementMethod ();
    }
     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);

    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 {
        that's the line we need to remove
        Selection.removeSelection(buffer);
    }*/
  }

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

}

EditTextを使用して以下のコード行を追加します

YourEditText.setMovementMethod(MyMovementMethod.getInstance());

editTextからすべてのタイプのsetMovementMethodsを削除します。それだけです:)

于 2015-08-20T20:18:04.367 に答える
0
setMovementMethod(null)

テキストビューの移動方法を null に設定します。もちろん、コードで何らかの方法で MovementMethod を処理したい場合、これにより NullPointerException が発生する可能性があります。

于 2012-05-13T18:15:18.410 に答える
0

user5211136 が言ったように、カスタム ArrowKeyMovementMethod を使用できます。その後、テキストが選択可能になり、ハイパーリンクも機能します。しかし、エラーと呼ばれるuser5211136のクラスの使用

「インテントのアクティビティが見つかりませんでした。インテント { act=android.intent.action.VIEW dat= https://... (エクストラあり) }」

私のため。

それが私がこのクラスを使用した理由です:

public class CustomArrowKeyMovementMethod extends ArrowKeyMovementMethod {

    public static MovementMethod getInstance(){
        return new CustomArrowKeyMovementMethod();
    }

    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);

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

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    String url = link[0].getURL().trim();
                    if(url.startsWith("www")) {
                        url = "http://" + url;
                    }
                    if (url.startsWith("https://") || url.startsWith("http://") || url.startsWith("tel:") || url.startsWith("mailto:")) {
                        try {
                            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                            widget.getContext().startActivity(browserIntent);
                        } catch (Exception e) {
                            Toast.makeText(widget.getContext(), "Couldn't open url", Toast.LENGTH_LONG).show();
                        }
                    }
                } else {
                    Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
                }
                return true;
            }
        }
        return super.onTouchEvent(widget, buffer, event);
    }
}

そしてそれを次のように呼びました:

textView.setMovementMethod();
于 2018-01-30T12:38:56.050 に答える