【问题标题】:Android - Hashtag in TextViewAndroid - TextView 中的标签
【发布时间】:2015-05-06 09:30:42
【问题描述】:

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

布局

<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);
    }
}

【问题讨论】:

标签: java android android-layout android-fragments


【解决方案1】:

您可以使用这个简单的库 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);

【讨论】:

  • 感谢您的贡献,不幸的是,您上面的代码对我不起作用。但是当我从github.com/danylovolokh/HashTagHelper 下载示例项目并复制它在我的项目中使用的必要代码时,它就可以正常工作了。
  • 没有在edittext上工作显示主题标签透明
【解决方案2】:

在TextView中使用这个,Clickable Span

// 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 中实现多个跨度,因此只需编写一个函数来执行此操作并为每个 #HashTag 调用它

【讨论】:

    【解决方案3】:

    尝试下面的代码来匹配以#开头的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);
    ...
    

    【讨论】:

      【解决方案4】:

      无论您希望它对点击做出什么反应,您都必须像在按钮上实现一样附加一个 onClickListener(假设您已经了解按钮点击的机制)。

      因此,可以这样:

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

      至于进入所述片段的方法,请确保您已将该片段配置为在实例化期间接收参数:

      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;
      }
      
      }
      

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

      MyFragmentActivity.myViewPager
      

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

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 2012-05-26
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多