Java Android-TextView中的标签
如何在TextView中实现hashtag?我想做的是在textview中实现可链接的标签。然后用户可以点击它(hashtag)并切换到另一个片段。这是我的布局和片段 布局Java Android-TextView中的标签,java,android,android-layout,android-fragments,Java,Android,Android Layout,Android Fragments,如何在TextView中实现hashtag?我想做的是在textview中实现可链接的标签。然后用户可以点击它(hashtag)并切换到另一个片段。这是我的布局和片段 布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main_fragment" android:layout_width="match_parent"
<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>
无论您希望它对点击做出什么反应,您都必须像在按钮上实现的一样将onClickListener附加到它(假设您已经了解了按钮点击的机制) 因此,有可能这样:
txtHashtag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// This is where you call the method to change fragment
}
});
MyFragmentActivity.myViewPager
至于转到所述片段的方法,请确保已将该片段配置为在实例化期间接收参数,如下所示:
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适配器进行配置,以便它可以按需实例化片段,如下所示:
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;
}
}
考虑到这一点,您现在可以创建添加和交换片段的方法,如下所示:
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);
}
private void swapFragment(){
ArrayList currentHashtags=((HashtagPagerAdapter)MyFragmentActivity.myViewPager.getAdapter()).getHashtags();
currentHashtags.add(txtHashtag.getText().toString());
((HashtagPagerAdapter)MyFragmentActivity.myViewPager.getAdapter()).setHashtags(currentHashtags);
MyFragmentActivity.myViewPager.setCurrentItem(currentHashtags.size(),true);
}
在文本视图中使用此可单击的范围
// 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());
您可以在textView中实现多个span,因此只需编写一个函数来实现,并为每个
#HashTag调用它即可使用此简单库
它的用法非常简单:
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);
尝试以下代码以匹配以#开头的文本视图文本:
看看这个例子,它帮助了我很多:谢谢你的贡献,不幸的是,你上面的代码对我不起作用。但是,当我从下载示例项目并复制它的必要代码以在我的项目中使用时,它就正常工作了。
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);
...
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);
...