বুদ্বুদ এডিটেক্সট যোগাযোগ


89

MultiAutoCompleteTextViewএটি কীভাবে Google+ অ্যাপ্লিকেশনটিতে প্রয়োগ করা হয় সে সম্পর্কে আমি কনফ্যাক্ট বুদবুদগুলি তৈরি করার চেষ্টা করছি । নীচে একটি স্ক্রিন শট রয়েছে:

Google+ রচনা পোস্ট স্ক্রিনশট

আমি DynamicDrawableSpanপাঠ্যের একটি স্প্যানের পটভূমিতে একটি স্প্যানিয়েবল অঙ্কনযোগ্য করতে ক্লাসটি প্রসারিত করার চেষ্টা করেছি

public class BubbleSpan extends DynamicDrawableSpan {
  private Context c;

  public BubbleSpan(Context context) {
    super();
    c = context;
  }

  @Override
  public Drawable getDrawable() {
    Resources res = c.getResources();
    Drawable d = res.getDrawable(R.drawable.oval);
    d.setBounds(0, 0, 100, 20);
    return d;
  }
}

যেখানে আমার ডিম্বাকৃতি.এক্সএমএল অঙ্কনযোগ্য তা হিসাবে সংজ্ঞায়িত করা হয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <solid android:color="#352765"/>
  <padding android:left="7dp" android:top="7dp"
    android:right="7dp" android:bottom="7dp" />
  <corners android:radius="6dp" />
</shape>

আমার ক্রিয়াকলাপ শ্রেণিতে MulitAutoCompleteTextView, আমি বুদ্বুদ স্প্যানটি সেট করেছিলাম:

final Editable e = tv.getEditableText();
final SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append("some sample text");
sb.setSpan(new BubbleSpan(getApplicationContext()), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
e.append(sb); 

তবে স্ট্রিংয়ের প্রথম 6 টি অক্ষরের পিছনে ডিম্বাকৃতি আকারের পরিবর্তে অক্ষরগুলি দৃশ্যমান হয় না এবং পটভূমিতে কোনও ডিম্বাকৃতি আঁকতে পারে না।

যদি আমি বুবলস্পানের getDrawable () পদ্ধতি পরিবর্তন করি তবে একটি আকার আঁকার পরিবর্তে একটি .png ব্যবহার করতে:

public Drawable getDrawable() {
  Resources res = c.getResources();
  Drawable d = res.getDrawable(android.R.drawable.bottom_bar);
  d.setBounds(0, 0, 100, 20);
  return d;
}

তারপরে .png প্রদর্শিত হবে তবে স্ট্রিংয়ের অক্ষরগুলি স্প্যানের একটি অংশ যা প্রদর্শিত হবে না। আমি কীভাবে এটি তৈরি করতে পারি যাতে স্প্যানের অক্ষরগুলি অগ্রভাগে প্রদর্শিত হয়, এরই মধ্যে একটি কাস্টম শেপের অঙ্কনযোগ্য পটভূমিতে প্রদর্শিত হয়?

আমি ImageSpanসাবক্লাসিংয়ের পরিবর্তে একটি ব্যবহার করার চেষ্টাও করেছিলাম DynamicDrawableSpanতবে ব্যর্থ হয়েছিল।



আপনি কীভাবে নির্বাচিত যোগাযোগের নম্বর পাচ্ছেন
শ্রীহরি

উত্তর:


55

সমস্ত সহায়তার জন্য @ ক্রিশ ধন্যবাদ। সুতরাং আমি এখানে এটি কিভাবে করেছি:

final SpannableStringBuilder sb = new SpannableStringBuilder();
TextView tv = createContactTextView(contactName);
BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(),bd.getIntrinsicHeight());

sb.append(contactName + ",");
sb.setSpan(new ImageSpan(bd), sb.length()-(contactName.length()+1), sb.length()-1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
to_input.setText(sb);

public TextView createContactTextView(String text){
  //creating textview dynamically
  TextView tv = new TextView(this);
  tv.setText(text);
  tv.setTextSize(20);
  tv.setBackgroundResource(R.drawable.oval);
  tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_clear_search_api_holo_light, 0);
  return tv;
}

public static Object convertViewToDrawable(View view) {
  int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
  view.measure(spec, spec);
  view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
  Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(),
            Bitmap.Config.ARGB_8888);
  Canvas c = new Canvas(b);
  c.translate(-view.getScrollX(), -view.getScrollY());
  view.draw(c);
  view.setDrawingCacheEnabled(true);
  Bitmap cacheBmp = view.getDrawingCache();
  Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
  view.destroyDrawingCache();
  return new BitmapDrawable(viewBmp);

}

13
আমি দেখেছি যে স্কেলিং সমস্যার কারণে এটি সমস্ত ডিভাইসে কাজ করে না। এটি করার একটি আরও ভাল উপায় হ'ল রূপান্তর ভিউ থেকে বিটম্যাপটি ফিরে আসা, তারপরে অঙ্কনীয় প্রান্তগুলি সেট করার সময় আসল বিটম্যাপের মাত্রাগুলি ব্যবহার করুন। যেমন BitmapDrawable bd = new BitmapDrawable(bitmap); bd.setBounds(0,0,bitmap.getWidth(), bitmap.getHeight()); সমস্ত ডিভাইসে কাজ করে।
dmon

হাই, আমার এটি একটি নতুন প্রশ্নে পোস্ট করার দরকার হতে পারে তবে আপনি মাল্টি লাইন টেক্সটভিউগুলির সাথে সমস্যার সম্মুখীন হয়েছেন কিনা তা জানতে চেয়েছিলেন wanted আমি এটি অ্যান্ড্রয়েড 3.2 এবং "কখনও কখনও" এ চালাচ্ছি, দেখে মনে হচ্ছে বুদ্বুর প্রস্থটি ভালভাবে গণনা করা হচ্ছে না। যেমন পাঠ্যটি পরবর্তী পংক্তিতে চলবে না, তবে পরিবর্তে পাঠ্যদর্শনটির বাইরে চালিয়ে যাবে। আপনি যদি এটি দেখে থাকেন তবে কোনও পরামর্শ?
জোহান হিলবোল্ড

4
যদি বুদ্বুদ সহ পাঠ্যটি আরও বিস্তৃত হয় যে বুদবুদের চেয়ে স্বতঃপূরণ দুটি সারিতে দু'বার তৈরি হয়। আপনি এটি পাঠ্য ভিউতে সেট করে দিয়েছিলেন: টেক্সটভিউ.সেটম্যাক্সউইথ (এটি.জেটউইথ () - SOME_PADDING); I'এবং আমি এটিও ব্যবহার করছি (পাঠ্যটি যদি খুব বড় হয় তবে বুদ্বুদে দুটি লাইনে এবং ... এর শেষে রয়েছে): টেক্সটভিউ.সেটলিপসাইজ (ট্র্যাঙ্কেটএট.এ্যান্ড); টেক্সটভিউ.সেটসিংলাইন (মিথ্যা); টেক্সটভিউ.সেটম্যাক্সলাইনস (2);
সোস্যাল এরির

এই ড্রপডাউন তালিকা থেকে আপনি বেছে নেবেন wn কাজ করে। যদি আপনি সম্পাদনা করার জন্য কিছু পূর্বনির্ধারিত মান নির্ধারণ করতে চান তবে, আমি কীভাবে বর্ডার এন ক্রস বোতামের সাহায্যে সেই পাঠ্যটি গুটিয়ে রাখতে পারি?
ব্রজ

4
আপনি কীভাবে টেক্সটটি মুছতে পাঠ্যদর্শনটিতে বিভিন্ন আইটেমে ক্লিকলিস্টার যুক্ত করেন।
নাম্বি

21

আপনার জন্য একটি সম্পূর্ণ সমাধান এখানে

//creating textview dynamicalyy
TextView textView=new TextView(context);
textview.setText("Lauren amos");
textview.setbackgroundResource(r.color.urovalshape);
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.icon_cross, 0);


BitmapDrawable dd = (BitmapDrawable) SmsUtil.getDrawableFromTExtView(textView);
edittext.settext(addSmily(dd));

//convert image to spannableString
public SpannableStringBuilder addSmily(Drawable dd) {
 dd.setBounds(0, 0, dd.getIntrinsicWidth(),dd.getIntrinsicHeight());
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(":-)");
builder.setSpan(new ImageSpan(dd), builder.length() - ":-)".length(),builder.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

return builder;
}

  //convert view to drawable
  public static Object getDrawableFromTExtView(View view) {

    int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    view.measure(spec, spec);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    c.translate(-view.getScrollX(), -view.getScrollY());
    view.draw(c);
    view.setDrawingCacheEnabled(true);
    Bitmap cacheBmp = view.getDrawingCache();
    Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
    view.destroyDrawingCache();
    return new BitmapDrawable(viewBmp);

}

আপনার যদি কেউ স্প্যান্বেল ব্যবহার করতে চান তবে সম্পূর্ণ প্রকল্প ফাইলটি এখানে


4
ধন্যবাদ ... আপনার সমাধানটি ঠিকঠাক কাজ করে তবে আমার সমস্যাগুলি হ'ল আমি এডিডি-বোতামের বুদ্বুদ-পাঠ্যটি সম্পাদনা-পাঠ্যে যুক্ত করা হয় তবে যখন আমি সম্পাদনা-পাঠ্য সাফ করি এবং পুনরায় প্রবেশ করার চেষ্টা করি (বোতাম যুক্ত চাপুন) পূর্বে যুক্ত বুদবুদটি অবশিষ্ট থাকে এবং নতুন একটি সংযুক্ত করা হয়। এবং ডান পাশের ক্রস সাইন টিপলে আমি বুদবুদও সরিয়ে ফেলি।
গোবিন্দ রাঠোদ

প্রথম ইস্যুকে সম্বোধন করা i আমি অনুমান করি আপনি তালিকায় পাঠ্য সংরক্ষণ করেছেন এবং সম্পাদনা পাঠ্য সাফ করার সময় আপনি সাফ করেননি। আমি কৌতুকপূর্ণ হতে পারি না, এটি কেবলমাত্র অনুমান হিসাবে আমি কীভাবে আপনার কোডটি জানি না।
কৃষ্ণ শ্রেষ্ঠ

আমি এটির একটি পুরাতন পোস্ট জানি, তবে আমার প্রশ্নের উত্তর দরকার ... আমি উপরে বর্ণিত অনুরূপ অ্যাপ্লিকেশনটি তৈরি করছি..আমি পরামর্শগুলির জন্য মাল্টিআউটো কমপ্লিট টেক্সটভিউ ব্যবহার করছি এবং তারপরে আইটেমটি ক্লিক করা হলে বুদবুদগুলি তৈরি করুন .. বুদবুদ সফলভাবে তৈরি হয় তবে আমার সমস্যাটি হ'ল আমি চাই না যে দুটি বুদবুদগুলির মধ্যে কার্সার উপস্থিত হবে ... আমি মাল্টিআউটো কমপ্লিটটিেক্সটভিউয়ের জন্য স্পেস টোকেনাইজার ব্যবহার করছি..এটি কীভাবে অর্জন করতে হয় তার কোনও ক্লু ??
বিজয়রাজ

@ ক্রিশ এই কোডটির জন্য ধন্যবাদ, তবুও আমার একটি প্রশ্ন রয়েছে। আমার এমন একটি পরিস্থিতি রয়েছে যেখানে আমার সাথে ইতিমধ্যে কিছু মান রয়েছে এবং আমি এগুলি স্প্যানিয়েবল পাঠ হিসাবে সরাসরি সম্পাদনা পাঠ্যে আটকিয়ে দেব। যাইহোক, আমি এখনই আশ্চর্য হয়েছি যে স্প্যানিয়েবল প্রকল্প থেকে আপনার কোডগুলি এই জাতীয় কার্যকারিতার সাথে একত্রিত করা সম্ভব। আমি রান সময় মুছে ফেলা নাম যোগ করার ক্ষমতা রাখতে চাই, গুচ্ছের মধ্যে যোগ হতে পারে, তবে মুছুন স্বাভাবিক হিসাবে (এক এক করে) .. ধন্যবাদ
কুলদীপ

5

আমি একটি লাইব্রেরি পেয়েছি যা আপনি যা খুঁজছেন তা করে:

  • ডিফল্ট বা সম্পূর্ণ কাস্টমাইজযোগ্য (আপনি এমনকি নিজের নিজস্ব লেআউটটি ব্যবহার করতে পারেন)
  • মাল্টলাইন সমর্থন
  • শ্রোতা ক্লিক করুন

এখানে দেখুন

এখানে একটি কুইকস্টার্ট:

আপনার লেআউটে চিপভিউ যুক্ত করুন বা এটি প্রোগ্রামিকভাবে তৈরি করুন:

<com.plumillonforge.android.chipview.ChipView
    android:id="@+id/chipview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

এটি ডেটা তালিকার সাথে শুরু করুন যা বিমূর্ত চিপ এবং একটি ক্লিক শ্রোতার প্রসারিত করে (যদি আপনি চান):

List<Chip> chipList = new ArrayList<>();
chipList.add(new Tag("Lorem"));
chipList.add(new Tag("Ipsum dolor"));
chipList.add(new Tag("Sit amet"));
chipList.add(new Tag("Consectetur"));
chipList.add(new Tag("adipiscing elit"));
ChipView chipDefault = (ChipView) findViewById(R.id.chipview);
chipDefault.setChipList(chipList);
chipDefault.setOnChipClickListener(new OnChipClickListener() {
        @Override
        public void onChipClick(Chip chip) {
            // Action here !
        }
    });

ডিফল্ট চিপভিউ এইভাবে রেন্ডার করা হয়:

ডিফল্ট চিপভিউ

তবে আপনি সামগ্রিক থেকে চিপ স্তরের মতো আপনার পছন্দ অনুসারে কাস্টমাইজ করতে পারেন:

সামগ্রিক চিপভিউ কাস্টম চিপভিউ

এটি কোনও মাল্টিআউটোকম্পিউল্ট নয় তবে আপনি এটি নকল করতে পরিচালনা করতে পারেন (আমি আসলে এটি এর মতো ব্যবহার করছি)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.