Java Android-TextView中的标签

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"

如何在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"
    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);
...