2015-05-06 22 views
8

Wie Hashtag in TextView implementieren? Was ich tun möchte, ist Linkable Hashtag in Textview implementieren. Dann kann der Benutzer darauf klicken (Hashtag) und zu einem anderen Fragment wechseln. Das ist mein Layout und Fragment.Android - Hashtag in TextView

Layout-

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

Fragment

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

Bitte Beratung. Vielen Dank.

+0

Schauen Sie sich dieses Beispiel an, es hat mir sehr geholfen: [Link eingeben de script hier] (http://stackoverflow.com/questions/25363310/clickable-words-inside-of-textview-android) – sunlover3

Antwort

0

Egal, welche Ansicht Sie mit Klicks reagieren möchten, Sie müssen einen onClickListener anhängen, so wie Sie es auf der Schaltfläche implementiert haben (vorausgesetzt, Sie haben die Funktionsweise von Schaltflächenklicks verstanden).

daher ist es möglich, es so zu haben:

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

Was das Verfahren zu dem genannten Fragmente zu gehen, sicherzustellen, dass Sie das Fragment während der Instanziierung als solche erhalten Parameter konfigurieren:

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

dann braucht Ihr ViewPager Adapter als so konfiguriert werden, dass sie die Fragmente auf Nachfrage wie so instanziieren:

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

} 

Sofern die ViewPager ist public static in Ihrem FragmentActivity Objekt, können Sie es von Ihrem MainFragment wie folgt zugreifen können:

MyFragmentActivity.myViewPager 

In diesem Sinne kann man nun die Methode erstellen hinzufügen und Swap-Fragment wie folgt:

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

verwenden, anklickbare Span in 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()); 

können Sie implementieren mehr als ein Spanne in einem Textview, schreiben so einfach eine Funktion, das zu tun und es nennen jeder für #HashTag

11

Sie diese einfache Bibliothek verwenden können HashTagHelper

Es hat sehr einfache Nutzung:

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); 
+0

Vielen Dank für Ihren Beitrag leider hat Ihr Code oben für mich nicht funktioniert. Aber wenn ich das Beispielprojekt von https://github.com/danylovolokh/HashTagHelper herunterladen und kopieren ist es notwendig, Codes in meinem Projekt zu verwenden, dann richtig es funktionierte. – oguzhan

1

unten Versuchen Code zu TextView Text passen, die mit # beginnen:

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