Create clickable link in text view in android

后端 未结 2 755
Happy的楠姐
Happy的楠姐 2020-11-29 09:55

I have some hash tags in a TextView which are starts with \'#\'

Example:\"#one#two Hello World #three\".

I wants these hash tags clickable separ

相关标签:
2条回答
  • 2020-11-29 10:40

    You can use LinearLayout :

    • In xml add :

      <EditText
          android:id="@+id/tag_ET"
          android:layout_width="0dp"
          android:layout_height="fill_parent"
          android:layout_weight="4"
          android:gravity="left"
          android:inputType="text" />
      
      <Button
          android:id="@+id/add_Btn"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_gravity="right"
          android:layout_weight="1"
          android:text="@string/tags_add_btn_text" />
      

      <LinearLayout
          android:id="@+id/tags_view"
          android:layout_width="wrap_content"
          android:layout_height="50dp"
          android:orientation="horizontal" />
      

    • Init layout :

      // EditText to write Tags.
      EditText tag = (EditText) findViewById(R.id.tag_ET));
      // Button used to add tags
      Button addTagBtn = (Button) findViewById(R.id.add_Btn));
      // layout contains added tags.
      final LinearLayout tagsView = (LinearLayout) findViewById(R.id.tags_view);
      
    • Add tags to tagView :

          final String tagTxt = tagEt.getText().toString();
          if (!tagTxt.isEmpty()) {
              Spannable buttonLabel = new SpannableString(tagTxt);
      
              // clear tag edit text
              tagEt.setText("");
      
              // add tag to layout
              Button btn = new Button(this);
              LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
              LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
              lout.addView(btn, tagsView);
      
              btn.setText(buttonLabel);
              btn.setBackgroundResource(R.drawable.hover);
              btn.setOnClickListener(new OnClickListener() {
      
                  @Override
                  public void onClick(View v) {
                      // Toast whatever you want.
                      Toast.makeText(getApplicationContext(), tagTxt,1000).show();
                  }
              });
          }
      
    0 讨论(0)
  • 2020-11-29 10:45

    Modify the below according to your requirement. Use a SpannableString

    String s ="#one #Two Hello World #three";
    String split[] = s.split("#");
    TextView_tv = (TextView) findViewById( R.id.tv );
    for(int i=1;i<split.length;i++)
    {
      SpannableString ss1=  new SpannableString("#"+split[i]);     
      ss1.setSpan(new  MyClickableSpan(""+i), 0, 1,  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      ss1.setSpan(newForegroundColorSpan(Color.RED),0,1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      _tv.append(ss1);
       _tv.append(" ");   
    }
    _tv.setMovementMethod(LinkMovementMethod.getInstance());
    
    class MyClickableSpan extends ClickableSpan{    
    String clicked;
    public MyClickableSpan(String string) {
    
        super();
        clicked =string;
        }
    
        public void onClick(View tv) {
            if(clicked.equals("1"))
            {
                 Toast.makeText(getApplicationContext(), "One",1000).show();
            }
            else if(clicked.equals("2"))
            {
                Toast.makeText(getApplicationContext(), "Two",1000).show();
            }
            else
            {
                Toast.makeText(getApplicationContext(), "Three",1000).show();       
            }
    
       }
    
        @Override
        public void updateDrawState(TextPaint ds) {
           ds.setUnderlineText(false); // set to false to remove underline
        }
        } 
       }
    

    Snap on Emulator

    On each hash click displays toast one, two and three. Instead of toast start a new activity.

    enter image description here

    Edit:

    If you want the string clicked

     ss1.setSpan(new  MyClickableSpan(""+i,split[i]), 0, 1,  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    

    Then

     String clicked;
     String astring;
     public MyClickableSpan(String check,String actualstring) {
    super();
    clicked =check;
    astring =actualstring; // pass this to next activity using intent
    }
    

    Then

      public void onClick(View tv) {
            if(clicked.equals("1"))
            {
                 Toast.makeText(getApplicationContext(), astring,1000).show();
            }
            else if(clicked.equals("2"))
            {
                Toast.makeText(getApplicationContext(), astring,1000).show();
            }
            else
            {
                Toast.makeText(getApplicationContext(), astring,1000).show();       
            }
    
       }
    
    0 讨论(0)
提交回复
热议问题