Разработка приложений для Android Twitter и использование TextView и Linkify - PullRequest
4 голосов
/ 24 марта 2010

Я занимаюсь разработкой приложения для Твиттера, в котором я хочу, чтобы пользователь отображал временные шкалы, а текстовое представление в списках требуется для выполнения кликов (http://)URLs, (@) имен пользователей и ( #) hasTags и я хочу вызывать пользовательские методы для этих действий, я использовал класс Linkify и действия, но они бесполезны, потому что нужная мне настройка не может быть включена.

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

У меня есть решение проблемы, чтобы проверить это, перейдите по ссылке ниже http://www.orangeapple.org/?p=354

2 голосов
/ 03 октября 2012

Вот мое решение. Основная идея состоит в том, чтобы разделить текстовые слова и создать 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()]);
    }

}
0 голосов
/ 24 марта 2010

Существует множество addLinks() методов для Linkify, один из которых может позволить вам достичь ваших целей, если ваша цель - начать действие с этих ссылок.

Вы также можете проверить исходный код на Linkify, чтобы увидеть, как вы можете создать свой собственный, соответствующий вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...