Android – TextView中的标签

如何在TextView中实现hashtag? 我想要做的是在textview中实现可链接的hashtag。 然后用户可以点击它(hashtag)并切换到另一个片段。 这是我的布局和片段。

布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainFragment" > <TextView android:id="@+id/txtHashtag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Iena I #love you !!!"/> </RelativeLayout> 

分段

 package com.xxxx; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.xxxxx.R; public class MainFragment extends Fragment{ private TextView txtHashtag; public MainFragment() { // TODO Auto-generated constructor stub } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View v = LayoutInflater.from(getActivity()).inflate(R.layout.activity_main_fragment, null); txtHashtag = (TextView) v.findViewById(R.id.txtHashtag); return v; } @Override public void onDestroy() { super.onDestroy(); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); } } 

请指教。 谢谢。

Solutions Collecting From Web of "Android – TextView中的标签"

你可以使用这个简单的库HashTagHelper

它有非常简单的用法:

 mHashTagText = (TextView) findViewById(R.id.text); mTextHashTagHelper = HashTagHelper.Creator.create(getResources().getColor(R.color.colorPrimary), new HashTagHelper.OnHashTagClickListener() { @Override public void onHashTagClicked(String hashTag) { } }); // pass a TextView or any descendant of it (incliding EditText) here. // Hash tags that are in the text will be hightlighed with a color passed to HasTagHelper mTextHashTagHelper.handle(mHashTagText); 

在TextView中使用这个可点击范围

 // setting span SpannableString tagSpan = new SpannableString("#clickMe"); ClickableSpan clickSpan = new ClickableSpan() { @Override public void onClick(View textView) { //code to swtich to new fragment } @Override public void updateDrawState(TextPaint paint) { super.updateDrawState(paint); paint.setUnderlineText(true); // set underline if you want to underline paint.setColor(Color.BLUE); // set the color to blue } }; tagSpan.setSpan(clickSpan, startPosition, endPosition, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); TextView txtHashtag = (TextView) findViewById(R.id.txtHashtag); txtHashtag.setText(tagSpan); txtHashtag.setMovementMethod(LinkMovementMethod.getInstance()); 

您可以在#HashTag实现多个跨度,所以只需编写一个函数来为每个#HashTag

尝试下面的代码来匹配以#开头的TextView文本:

 ... txtHashtag = (TextView) v.findViewById(R.id.txtHashtag); //Pattern to find if there's a hash tag in the message Pattern tagMatcher = Pattern.compile("[#]+[A-Za-z0-9-_]+\\b"); String url = "https://www.google.co.in/"; //Attach Linkify to TextView Linkify.addLinks(txtHashtag, tagMatcher, url); ... 

无论你想要点击什么视图,你必须附加一个onClickListener它就像你在button上实现(假设你已经理解button点击的机制)。

因此,可以这样做:

 txtHashtag.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // This is where you call the method to change fragment } }); 

至于去所述片段的方法,请确保您已将该片段configuration为在实例化过程中接收参数,例如:

 public class HashtagViewFragment extends Fragment { private static final String TAG = "HashtagViewFragment"; public static final String PARAM_HASHTAG = "hashtag_string"; private TextView txtPassedString; private String receivedString; public static HashtagViewFragment newInstance(String myHashtag) { HashtagViewFragment fragment = new HashtagViewFragment(); Bundle args = new Bundle(); args.putString(PARAM_HASHTAG, myHashtag); fragment.setArguments(args); return fragment; } public HashtagViewFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { receivedString = getArguments().getString(PARAM_HASHTAG); } else { receivedString = ""; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.HashtagViewFragment, container, false); txtPassedString = (TextView) view.findById(R.id.tv_hashtag); txtPassedString.setText(receivedString); return view; } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); } } 

那么,您的ViewPager适配器需要进行configuration,以便它可以按需要实例化片段,如下所示:

 public class HashtagPagerAdapter extends FragmentStatePagerAdapter { private Context mContext; private ArrayList<String> hashtags = new ArrayList<>(); public HashtagPagerAdapter(FragmentManager fm, Context ctx) { super(fm); this.mContext = ctx; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new MainFragment(); default: return HashtagViewFragment.newInstance(hashtags.get(position - 1)); } } private void setHashtags(ArrayList<String> latestHashtags) { this.hashtags = latestHashtags; notifyDataSetChanged(); } private ArrayList<String> getHashtags() { return this.hashtags; } @Override public int getCount() { return hashtags.size() + 1; } } 

假如ViewPager在你的FragmentActivity对象中是公共静态的,你可以像这样从你的MainFragment中访问它:

 MyFragmentActivity.myViewPager 

考虑到这一点,现在可以创build方法来添加和交换片段,如下所示:

 private void swapFragment() { ArrayList<String> currentHashtags = ((HashtagPagerAdapter)MyFragmentActivity.myViewPager.getAdapter()).getHashtags(); currentHashtags.add(txtHashtag.getText().toString()); ((HashtagPagerAdapter)MyFragmentActivity.myViewPager.getAdapter()).setHashtags(currentHashtags); MyFragmentActivity.myViewPager.setCurrentItem(currentHashtags.size(), true); }