0

ポップアップダイアログボックスに[角かっこ]で囲まれたテキストへのリンクを追加しました。ただし、リンクはクリックできません(ボタンを押しても何も起こりません)。理由がわからない(!)

これが私のダイアログボックスのアクティビティです。

public void popupDefinition(CharSequence term, LinkedHashMap<String, String> dictionaryMap){
    SpannableString definition = new SpannableString(dictionaryMap.get(term)); // grab the definition by checking against the dictionary map hash
    Linkify.addLinks(definition, pattern, scheme); // find text in square brackets, add links

    AlertDialog alertDialog = new AlertDialog.Builder(ListProjectActivity.this).create(); // create a dialog box
    alertDialog.setMessage(definitionFormatted); // set dialog box message
    alertDialog.show(); // actually display the dialog box
    }

'scheme'と'pattern'は、次のように以前に定義されています。

final static Pattern pattern = Pattern.compile("\\[[^]]*]"); // defines the fact that links are bound by [square brackets]
final String scheme = "http://example.com/"; // THIS IS NOT WORKING

表示されるリンク(青色できれいに下線が引かれている)をタップしても、応答がないのはなぜですか?

私は実際にURLリンクを起動しようとはしていません(発生したときにACTION_VIEWインテントをリダイレクトします)が、それに到達する前に何らかの応答が発生していることを確認する必要があります...

4

1 に答える 1

3

私は実際にURLリンクを起動しようとはしていません

URLを使用する必要がないため、URLSpansのみを作成するため、カスタムLinkifyスキームを作成しようと気にしないでください。TextViewのキーワードからアクティビティを開始したいだけです。似ているが重複していない質問の1つで述べたように、カスタムスパンを使用して、ActivitySpanを紹介します。

public class ActivitySpan extends ClickableSpan {
    String keyword;
    public ActivitySpan(String keyword) {
        super();
        this.keyword = keyword;
    }

    @Override
    public void onClick(View v) {
        Context context = v.getContext();
        Intent intent = new Intent(context, AnotherActivity.class);
        intent.putExtra("keyword", keyword);
        context.startActivity(intent);
    }
}

ここにはベルやホイッスルはありません。このスパンは、[keyword]角かっこで囲んだものを取り、別のアクティビティに渡します。

URLSpansのためにLinkifyを使用するというアイデアは好きではありませんが、そのパターンマッチングとスパンの作成は素晴らしいので、コピーして変更しました。

private void addLinks(TextView textView, Pattern pattern) {
    SpannableString spannable = SpannableString.valueOf(textView.getText());
    Matcher matcher = pattern.matcher(spannable);

    // Create ActivitySpans for each match
    while (matcher.find())
        spannable.setSpan(new ActivitySpan(matcher.group()), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    // Set new spans in TextView
    textView.setText(spannable);

    // Listen for spannable clicks, if not already
    MovementMethod m = textView.getMovementMethod();
    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        if (textView.getLinksClickable()) {
            textView.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}

注意として、このメソッドは[brackets]周囲の各キーワードを削除しませんが、whileループで簡単に削除できます。

これを使用するには、TextViewとPatternをaddLinks()inonCreate()Voilaに渡すだけです。


あなたのための実用的な例:

public class Example extends Activity {
    Pattern pattern = Pattern.compile("\\[[^]]*]");

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

        popupDefinition("Example: A [pattern] or [model], as of something to be [imitated] or [avoided]");
    }

    // It seems like you can call "popupDefinition(dictionaryMap.get(term));" rather than pass both.  
    public void popupDefinition(String string){
        SpannableString spannable = new SpannableString(string);
        Matcher matcher = pattern.matcher(spannable);

        // Create ActivitySpans for each match
        while (matcher.find())
            spannable.setSpan(new ActivitySpan(matcher.group()), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        // Create a new TextView with these spans and enable the clickable links
        TextView textView = new TextView(this);
        textView.setText(spannable);
        textView.setMovementMethod(LinkMovementMethod.getInstance());

        // Create and display an AlertDialog with this TextView
        AlertDialog alertDialog = new AlertDialog.Builder(this)
                .setView(textView)
                .create(); 
        alertDialog.show(); 
    }


    public class ActivitySpan extends ClickableSpan {
        String keyword;
        public ActivitySpan(String keyword) {
            super();
            this.keyword = keyword;
        }

        @Override
        public void onClick(View v) {
            Context context = v.getContext();
            Toast.makeText(context, keyword, Toast.LENGTH_SHORT).show();
        }
    }
}
于 2012-09-11T18:54:02.013 に答える