2017-07-07 11 views
-2

テキストの中でクリック可能なテキストを作成しようとしていますが、私にとってはうまくいくstackoverflowのコードを見つけるのは幸運でしたが、クリックを適用したい私の質問は、今では私は必要なパラメータを呼び出して渡すことができ、再利用可能な方法で、以下のコードをバンドルすることが可能ですし、どのように以下Androidで使用可能なメソッドにコードをラップします

SpannableString ss = new SpannableString("Android is a Software stack"); 
    ClickableSpan clickableSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View textView) { 
      startActivity(new Intent(MainActivity.this, NextActivity.class)); 
     } 
     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }; 
    ss.setSpan(clickableSpan, 10, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(new StyleSpan(Typeface.ITALIC), 10, 27, 0); 

    TextView textView = (TextView) findViewById(R.id.hello); 
    textView.setText(ss); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    textView.setHighlightColor(Color.TRANSPARENT); 

場合はどのように上の任意の提案、私が使用する決意を持っているものであるということですそれをより良くするには?

TextView textView = (TextView) findViewById(R.id.one) ; 
    String s="This link has many clickable text which are link one, link two 
    and the last whick is link three"; 
    SpannableString ss = new SpannableString(s); 
    String one ="link one"; 
    String two ="link two"; 
    String three ="link three"; 
    int firstIndex = s.indexOf(one); 
    int secondIndex = s.indexOf(two); 
    int thirdIndex = s.indexOf(three); 

    ClickableSpan firstClick = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      startActivity(new Intent(MainActivity.this, a.class)); 
     } 
     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }; 
    ClickableSpan secondClick = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      startActivity(new Intent(MainActivity.this, b.class)); 
     } 
     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }; 
    ClickableSpan thirdClick = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      startActivity(new Intent(MainActivity.this, c.class)); 
     } 
     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }; 
    ss.setSpan(firstClick,firstIndex, firstIndex+one.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(secondClick,secondIndex, secondIndex+two.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(thirdClick,thirdIndex, thirdIndex+three.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    textView.setLinksClickable(true); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    textView.setText(ss, TextView.BufferType.SPANNABLE); 
+0

新しい方法で何を変更しますか? R.idを知っている既存のテキストウィジェット?影響を受けるテキストの部分をどのように知っていますか? –

+0

あなたのニーズに合致する 'SpannableString'のサブクラスを作成できるようにパラメトリックにする必要があります。 – AxelH

+0

leos-literak、Droidmanによって与えられた答えのように、ちょっとしたテキストの間隔でメソッドを呼び出せるようにしたい。 – shollynoob

答えて

0

いつもあなたを、ユーザーがテキストの一部をクリックしたときに、いくつかのActivityを開始する必要があると仮定すると、それはそのようになります。

@UiThread 
public static void setClickable(@NonNull TextView tv, 
           @NonNull SpannableString ss, 
           int start, int end, 
           @NonNull final Context from, @NonNull final Class to){ 

    ClickableSpan clickableSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View textView) { 
      from.startActivity(new Intent(from, to)); 
     } 
     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }; 
    ss.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(new StyleSpan(Typeface.ITALIC), start, end, 0); 
    tv.setText(ss); 
    tv.setMovementMethod(LinkMovementMethod.getInstance()); 
    tv.setHighlightColor(Color.TRANSPARENT); 
} 

使用例を(から呼び出され、あなたの与えられたユースケースに基づいて、 Activity):

SpannableString ss = new SpannableString("Android is a Software stack"); 
    TextView textView = (TextView) findViewById(R.id.hello); 
    setClickable(textView, ss, 10, 27, this, NextActivity.class); 

注:Context.startActivity()があなたの代わりにActivityインスタンスを使用する必要があるだろうとAPIの下に、API 16以降で使用できますContext。また、必要に応じてパラメータを追加/削除してください。上記の例は、どんなクラスでも動作し、必要なものを実装する基本的なアイデアを提供することを目的としています。

+0

エラー 変数 'from'は内部クラスからアクセスされ、final宣言が必要で、変数 'to'は内部クラスからアクセスされ、最終宣言が必要です – shollynoob

+0

@shollynoob y、テストしなかったので、そのコード。ちょうどそれらのパラメータを最終的に宣言してください – Droidman

+0

私はそれを正しくしようとしなかった、コードを変更することができれば感謝します – shollynoob

関連する問題