1

例:

@SoccerBible をフォローし、これを RT してください。今夜、ロナウドが https://bit.ly/133/comでゴールを決めた場合、幸運な勝者 1 名にナイキ クラッシュ ヴェイパー 8 をプレゼントします! #ロナウドコンプ

私のリストビューコンポーネントで。ツイートのリストを表示している場所。ツイート本文の@、#、URLに色を付けました。すべてが動的にクリック可能です。

私の質問は、色のないテキストをクリック可能にする方法です。Linkify.addLinks と Pattern API を使用してクリック可能にしました。しかし、@、#、および URL 以外のテキストは、色を追加せずにクリックできるようにしたかったのです。

ありがとう、ドミニク

4

1 に答える 1

5

Twitter アプリの場合、ツイートのハンドルをクリックし、ツイートのテキストをクリックしてツイートの詳細を取得するという同じ要件もありました。

そのために、このLinkEnabledTextViewを使用しました。これにより、タスクを簡単に実行できるようになりました。

プロジェクトにクラスを追加しただけで、List Item の代わりに単純な TextView で、LinkEnabledTextView のオブジェクト/インスタンスを使用しました。

上記のリンクに完全なデモがあります。確認してください。

編集: アダプター コード特に onTextLinkClick() を確認してから、holder.twtdata.setOnClickListener() を確認します。

    private static class EfficientAdapter extends BaseAdapter implements TextLinkClickListener {
        private LayoutInflater mInflater;
        static int pos =0;
        public EfficientAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
        }

        public int getCount() {
            return timelines.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(final int position, View convertView,
                ViewGroup parent) {

            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.listtimerow, null);
                holder = new ViewHolder();
                holder.twtdata = (LinkEnabledTextView) convertView
                        .findViewById(R.id.twtdata);
                holder.twtnm = (TextView) convertView
                        .findViewById(R.id.twthandle);
                holder.twtimg = (ImageView) convertView
                        .findViewById(R.id.avatar);
                holder.twtdt = (TextView) convertView
                        .findViewById(R.id.created);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
               holder.twtdata.setOnTextLinkClickListener(this);
                holder.twtdata.gatherLinksForText(timelines[position]);
                holder.twtdata.setTextColor(Color.BLACK);
                holder.twtdata.setLinkTextColor(Color.BLUE);

                MovementMethod m = holder.twtdata.getMovementMethod();
                if ((m == null) || !(m instanceof LinkMovementMethod)) {
                    if (holder.twtdata.getLinksClickable()) {
                        holder.twtdata.setMovementMethod(LinkMovementMethod.getInstance());
                    }
                }

            if (bmpimg1[position] != null)
                holder.twtimg.setImageBitmap(bmpimg1[position]);
            holder.twtnm.setText(twitterhandles[position]);
            Date credate = new Date(created[position]);

            String dt = credate.getDate() + " "
                    + getMonthName(credate.getMonth());
            holder.twtdt.setText(dt);

            holder.twtdata.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    pos = position;
                    if(linkselected==true)
                        return;
                    childSelected = true;

                    Log.i("mention data", timelines[position]);
                    Intent textintent = new Intent(ctx, TimelineRe.class);
                    textintent.putExtra("userid", userid[position]);
                    textintent.putExtra("nm", twitterhandles[position]);
                    textintent.putExtra("msg", timelines[position]);
                    textintent.putExtra("pos", position);
                    textintent.putExtra("frm", "t");
                    textintent.putExtra("img", bmpimg1[position]);

                    if (urlentities[position] != null
                            && dpurlentities[position] != null) {
                    textintent.putExtra("urlentity", urlentities[position]);
                    textintent.putExtra("dpurlentity", dpurlentities[position]);
                    }
                    textintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                    ctx.startActivity(textintent);
                }
            });
            holder.twtnm.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    childSelected = true;
                    Intent iconintent = new Intent(ctx, TweetRe.class);
                    iconintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    iconintent.putExtra("userid", userid[position]);
                    iconintent.putExtra("pos", position);
                    iconintent.putExtra("frm", "t");
                    iconintent.putExtra("img", bmpimg1[position]);
                    ctx.startActivity(iconintent);
                }
            });
            holder.twtimg.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    childSelected = true;
                    Intent iconintent = new Intent(ctx, TweetRe.class);
                    iconintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    iconintent.putExtra("userid", userid[position]);
                    iconintent.putExtra("pos", position);
                    iconintent.putExtra("frm", "t");
                    iconintent.putExtra("img", bmpimg1[position]);
                    ctx.startActivity(iconintent);
                }
            });
            return convertView;

        }
        @Override 
        public int getItemViewType(int position) { 
            return position; 
        } 

        @Override 
        public int getViewTypeCount() { 
            return timelines.length;
        } 
        static class ViewHolder {

            TextView twtdt;
            LinkEnabledTextView twtdata;
            ImageView twtimg;
            TextView twtnm;
        }

        public void onTextLinkClick(View textView, String clickedString)
        {
            if (isWiFiConnected == false) {
                Toast.makeText(ctx,
                        "No Internet Connection \nPlease Check and Retry",
                        Toast.LENGTH_SHORT).show();

                return;
            }
            android.util.Log.v("Hyperlink clicked is :: " + clickedString, "Hyperlink clicked is :: " + clickedString);
            if(clickedString.charAt(0)=='#')
            {
                linkselected=true;
                childSelected=true;
                Intent reintent = new Intent(ctx,
                        Search.class);
                reintent.putExtra("frm", "l");
                reintent.putExtra("keyword",clickedString.substring(1, clickedString.length()) );
                reintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ctx.startActivity(reintent);
            }
            else if(clickedString.charAt(0)=='@')
            {
                linkselected=true;
                childSelected=true;
                Intent iconintent = new Intent(ctx, TweetRe.class);
                iconintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                iconintent.putExtra("snm", clickedString.substring(1,clickedString.length()));
                iconintent.putExtra("frm", "l");
//              iconintent.putExtra("userid", userid[pos]);
//              iconintent.putExtra("pos", pos);

//              iconintent.putExtra("img", bmpimg2[pos]);
                ctx.startActivity(iconintent);
            }
            else if(clickedString.charAt(0)=='h')
            {
                linkselected=true;
                childSelected=true;
                Intent iconintent = new Intent(ctx, ShowLink.class);
                iconintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                iconintent.putExtra("url","http://www."+dpurlentities[pos]);
                ctx.startActivity(iconintent);

            }
        }
    }
于 2012-06-22T09:07:14.030 に答える