Android Twitter应用程序开发及TextView和Linkify的使用

Android Twitter应用程序开发及TextView和Linkify的使用,android,twitter,Android,Twitter,我正在开发一种类似twitter的应用程序,我希望用户能够在列表中显示时间线和文本视图,以便点击(、(@)用户名和(#)hasTags和我想对这些操作调用自定义方法,我使用了Linkify类和操作,但是没有用,因为我需要的自定义无法合并。有很多addLinks()方法,如果您的目标是从这些链接开始一项活动,其中一种方法可以让您实现目标 您还可以检查源代码,看看如何创建满足您需要的自己的源代码。我有一个问题的解决方案要查看,请转到下面提到的链接。这是我的解决方案。 其主要思想是拆分文本单词,并为每

我正在开发一种类似twitter的应用程序,我希望用户能够在列表中显示时间线和文本视图,以便点击(、(@)用户名和(#)hasTags和我想对这些操作调用自定义方法,我使用了Linkify类和操作,但是没有用,因为我需要的自定义无法合并。

有很多
addLinks()
方法,如果您的目标是从这些链接开始一项活动,其中一种方法可以让您实现目标


您还可以检查源代码,看看如何创建满足您需要的自己的源代码。

我有一个问题的解决方案要查看,请转到下面提到的链接。

这是我的解决方案。 其主要思想是拆分文本单词,并为每个单词创建一个文本视图,用水平线性布局将每行包装起来,并将每行包装成垂直线性布局:

private LinearLayout mDescription; // vertical LinearLayout 

    private void setDescriptionText(String twitterText){
    String[] splitted;

    String regexp = "(@[-a-zA-Z0-9_]*)|(#[-a-zA-Z0-9_]*)|(http://[-a-zA-Z0-9/._]*)|(https://[-a-zA-Z0-9/._]*)|( )";

    TextSplitter splitter = new TextSplitter(regexp);
    splitted = splitter.split(twitterText);

    TextView[] textViews = new TextView[splitted.length];
    for (int i = 0; i < splitted.length; i++) {
        final String str = splitted[i];
        TextView textView = new TextView(mDescription.getContext());  
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
        textViews[i] = textView;


        textView.setText(str);
        textView.setTypeface(roboReg);
        textView.setTextColor(Color.WHITE);

        if (str.startsWith("@")){
            textView.setTextColor(mLinkColor);
            textView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    startWebViewActivity("https://twitter.com/"+str.substring(1));
                }
            });
        }else if (str.startsWith("#")){
            textView.setTextColor(mLinkColor);
            textView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    startWebViewActivity("https://twitter.com/#!/search/?q="+str.substring(1) + "&src=hash");
                }
            });

        }else if (str.startsWith("http://") || str.startsWith("https://")){
            textView.setTextColor(mLinkColor);
            textView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    startWebViewActivity(str);
                }
            });
        }
    }

    int maxWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 210, getResources().getDisplayMetrics());
    populateText(mDescription, maxWidth , textViews, mDescription.getContext());

}

private void populateText(LinearLayout ll,int maxWidth, View[] views, Context mContext) {

    ll.removeAllViews();
    LinearLayout.LayoutParams params;
    LinearLayout newLL = new LinearLayout(mContext);
    newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));
    newLL.setGravity(Gravity.LEFT);
    newLL.setOrientation(LinearLayout.HORIZONTAL);

    int widthSoFar = 0;

    for (int i = 0; i < views.length; i++) {
        LinearLayout LL = new LinearLayout(mContext);
        LL.setOrientation(LinearLayout.HORIZONTAL);
        LL.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
        LL.setLayoutParams(new ListView.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        views[i].measure(0, 0);
        params = new LinearLayout.LayoutParams(views[i].getMeasuredWidth(),
                LayoutParams.WRAP_CONTENT);
        LL.addView(views[i], params);
        LL.measure(0, 0);
        widthSoFar += views[i].getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS
        if (widthSoFar >= maxWidth) {
            ll.addView(newLL);

            newLL = new LinearLayout(mContext);
            newLL.setLayoutParams(new LayoutParams(
                    LayoutParams.FILL_PARENT,
                    LayoutParams.WRAP_CONTENT));
            newLL.setOrientation(LinearLayout.HORIZONTAL);
            newLL.setGravity(Gravity.LEFT);
            params = new LinearLayout.LayoutParams(LL
                    .getMeasuredWidth(), LL.getMeasuredHeight());
            newLL.addView(LL, params);
            widthSoFar = LL.getMeasuredWidth();
        } else {
            newLL.addView(LL);
        }
    }
    ll.addView(newLL);
}

private class TextSplitter {

    private Pattern pattern;
    private boolean keep_delimiters;

    public TextSplitter(Pattern pattern, boolean keep_delimiters) {
        this.pattern = pattern;
        this.keep_delimiters = keep_delimiters;
    }

    public TextSplitter(String pattern, boolean keep_delimiters) {
        this(Pattern.compile(pattern == null ? "" : pattern), keep_delimiters);
    }


    public TextSplitter(String pattern) {
        this(pattern, true);
    }

    public String[] split(String text) {
        if (text == null) {
            text = "";
        }

        int last_match = 0;
        LinkedList<String> splitted = new LinkedList<String>();

        Matcher m = this.pattern.matcher(text);

        while (m.find()) {

            splitted.add(text.substring(last_match, m.start()));

            if (this.keep_delimiters) {
                splitted.add(m.group());
            }

            last_match = m.end();
        }

        splitted.add(text.substring(last_match));

        return splitted.toArray(new String[splitted.size()]);
    }

}
专用线性布局mddescription;//垂直线性布局
私有void setDescriptionText(字符串twitterText){
字符串[]已拆分;
字符串regexp=“(@[-a-zA-Z0-9_]*)|(#[-a-zA-Z0-9_]*)|(http://[-a-zA-Z0-9/.]*)|(https://[-a-zA-Z0-9/.]*)|();
TextSplitter splitter=新的TextSplitter(regexp);
splitted=splitter.split(twitterText);
TextView[]TextView=新的TextView[splited.length];
对于(int i=0;i
你能解释一下你到底想做什么吗?“这是对@twitter.中使用的带有链接的正则表达式的测试”,如果这是