बबल एडिट टेक्स्ट से संपर्क करें


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 पात्रों के पीछे प्रदर्शित होने वाले अंडाकार आकार के बजाय, वर्ण दिखाई नहीं देते हैं और पृष्ठभूमि में कोई अंडाकार खींचने योग्य नहीं है।

अगर मैं BubbleSpan के 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लेकिन असफल रहा।



आप चयनित संपर्क नंबर कैसे प्राप्त कर रहे हैं
श्रीहरि

github.com/splitwise/TokenAutoComplete कुछ के लिए मददगार हो सकता है
-सलीब

जवाबों:


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

नमस्ते, मुझे इसे एक नए प्रश्न में पोस्ट करने की आवश्यकता हो सकती है, लेकिन जानना चाहता था कि क्या आपको मल्टी लाइन टेक्स्ट व्यू के साथ समस्याओं का सामना करना पड़ा है। मैं इसे एंड्रॉइड 3.2 और "कभी-कभी" पर चला रहा हूं, ऐसा लगता है कि बुलबुले की चौड़ाई अच्छी तरह से गणना नहीं की गई है। जैसे कि टेक्स्ट अगली पंक्ति में जारी नहीं रहेगा, बल्कि टेक्स्ट व्यू के बाहर जारी रहेगा। अगर आपने यह देखा है, कोई टिप्स?
जोहान हिलबॉल्ड

1
यदि बुलबुले वाला पाठ व्यापक है कि बुलबुले की तुलना में स्वतः पूर्ण दो पंक्तियों में दो बार बनाया जाता है। आप इसे टेक्स्टव्यू पर सेट करते हैं: textView.setMaxWidth (this.getWidth () - SOME_PADDING); `और 'll'am भी इसका उपयोग कर रहा है (यदि टेक्स्ट बहुत बड़ा है तो बबल में दो लाइनों में और अंत में ...) textView.setEllipsize (TruncateAt.END); textView.setSingleLine (गलत); textView.setMaxLines (2);
सोशलएयर

यह काम करता है ठीक wn यू ड्रॉपडाउन सूची से चयन करें। मामले में, अगर आप edittext को कुछ पूर्वनिर्धारित मान सेट करना चाहते हैं, तो, मैं उस पाठ को बॉर्डर एन क्रॉस बटन के साथ कैसे लपेट सकता हूं?
ब्रज

5
आप टेक्स्ट को हटाने के लिए टेक्स्टव्यू में अलग-अलग आइटम पर क्लिकलिस्टर कैसे जोड़ते हैं।
नंबि

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);

}

यहां संपूर्ण प्रोजेक्ट फ़ाइल है, यदि आप में से कोई भी स्पैनबल का उपयोग करना चाहता है


1
धन्यवाद ... आपका समाधान ठीक काम करता है, लेकिन मेरे मुद्दे तब हैं जब मैंने एडीडी बटन दबाया है बुलबुला-पाठ एडिट-टेक्स्ट में जोड़ा जाता है, लेकिन जब मैं संपादित-पाठ को साफ़ करता हूं और पहले से जोड़ा गया बुलबुला फिर से दर्ज करने (प्रेस बटन जोड़ने) की कोशिश कर रहा हूं और शेष नया भी जोड़ा गया है। और मैं बबल को भी हटाता हूं जब दाएं तरफ क्रॉस का चिह्न दबाएं।
गोविंद राठौड़

पहले अंक को संबोधित करना। मुझे लगता है कि आपने सूची में पाठ संग्रहीत किया है और आपने संपादित पाठ को साफ़ करते समय स्पष्ट नहीं किया है। मैं राइट नहीं हो सकता, यह केवल एक अनुमान था कि मैं न जानता हूँ कि आप कैसे कोड करते हैं।
कृष्णा श्रेष्ठ

मैं इसकी एक पुरानी पोस्ट जानता हूं, लेकिन मुझे अपने प्रश्न के उत्तर की आवश्यकता है..मैं उसी एप्लिकेशन का निर्माण कर रहा हूं, जैसा कि ऊपर दिखाया गया है..मैं सुझाव के लिए MultiAutoCompleteTextView का उपयोग कर रहा हूं और फिर आइटम के क्लिक होने पर बुलबुले बनाएं..इस बुलबुले को सफलतापूर्वक बनाया जाता है लेकिन मेरी समस्या यह है कि मैं नहीं चाहता कि कर्सर दो बुलबुलों के बीच दिखाई दे ... मैं मल्टीऑकोलेटेड टैक्स्ट व्यू..नि क्लू के लिए स्पेस टोकन का उपयोग कर रहा हूं?
विजयराज

@ इस कोड के लिए धन्यवाद, मेरे पास एक प्रश्न फिर भी है। मेरे पास एक ऐसी स्थिति है जहां मेरे पास पहले से ही कुछ मूल्य हैं, और मैं उन्हें सीधे ग्रंथों के रूप में संपादन योग्य पाठ में पेस्ट कर दूंगा। हालाँकि, अब मुझे आश्चर्य है कि इस तरह की कार्यक्षमता के साथ स्पैनेबल प्रोजेक्ट से अपने कोड को जोड़ना संभव है। मैं रन टाइम में डिलीट नामों को जोड़ने की क्षमता रखना चाहता हूं, जोड़ना गुच्छा में हो सकता है, हालांकि डिलीट हमेशा की तरह (एक-एक करके) है .. धन्यवाद
kuldeep

5

मुझे एक लाइब्रेरी मिली, जो आपके साथ देख रही है:

  • डिफ़ॉल्ट या पूरी तरह से अनुकूलन (आप अपने स्वयं के लेआउट का उपयोग भी कर सकते हैं)
  • बहुस्तरीय समर्थन
  • श्रोता क्लिक करें

यहाँ एक नज़र है

यहाँ एक तुरत प्रारम्भ:

अपने लेआउट में ChipView जोड़ें या इसे प्रोग्रामेटिक रूप से बनाएं:

<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 !
        }
    });

डिफ़ॉल्ट चिप दृश्य इस तरह प्रस्तुत किया गया है:

डिफ़ॉल्ट चिप दृश्य

लेकिन आप समग्र रूप से चिप स्तर से अनुकूलित कर सकते हैं:

कुल मिलाकर ChipView कस्टम चिप व्यू

यह एक बहुअर्थी नहीं है, लेकिन आप इसे नकल करने के लिए प्रबंधित कर सकते हैं (मैं वास्तव में इसे इस तरह उपयोग कर रहा हूं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.