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

时间:2010-03-24 11:31:36

标签: android twitter

我正在开发一种Twitter类型的应用程序,其中我希望用户将显示时间轴,并且列表中的Textview需要执行点击(http://)URLs,(@)用户名和( #)hasTags,我想调用这些操作的自定义方法,我使用了Linkify类和操作,但没有用,因为我需要的自定义无法合并。

3 个答案:

答案 0 :(得分:2)

我有一个问题的解决方案来检查它,请转到下面提到的链接http://www.orangeapple.org/?p=354

答案 1 :(得分:2)

这是我的解决方案。 主要思想是拆分文本单词并为每个单词创建一个TextView,用水平LinearLayout包装每一行,并将这些行包装成垂直的LinearLayout:

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

}

答案 2 :(得分:0)

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

您还可以查看Linkify的源代码,了解如何创建符合您需求的源代码。