как установить границу между составным текстовым представлением?

Я пытаюсь создать составное текстовое представление и показать его в EditText. Таким образом, пользователь может ввести что-то в EditText, и если пользователь нажал кнопку ввода на клавиатуре, то я преобразовываю этот текст в расширяемое текстовое представление после того, как этот пользователь может снова начать вводить текст и нажать кнопку ввода на клавиатуре, а затем снова создаст второе расширяемое текстовое представление и покажет его в изменить текст, но.

Где я застрял?

когда я создаю два составных текстовых представления, эти два текстовых представления слегка перекрывают друг друга. И я хочу установить границу между этими двумя текстовыми представлениями.

Я также пытался установить отступ между текстовым представлением, используя LayoutParam, но не успех.

Вот изображение, показывающее наложение текста друг на друга в EditText.

введите здесь описание изображения

г слова острый скрыт под вкусным

Вот мой код.

txtDishTags.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH
                    || actionId == EditorInfo.IME_ACTION_NEXT
                    || actionId == EditorInfo.IME_ACTION_DONE
                    || actionId == EditorInfo.IME_ACTION_GO) {
                txtDishTags.dismissDropDown();
                  if(txtDishTags.getText().toString().trim().length()>=1){
                isEntered = true;

                String[] separated = tags.split(",");
                tags = separated[separated.length-1];
                if(tags.trim().length()>=1){
                TextView tv = createContactTextView(tags);
                BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
                bd.setBounds(-20, 0, bd.getIntrinsicWidth(),
                        bd.getIntrinsicHeight());
                sb.append(tags + ",");
                sb1 = new SpannableStringBuilder();
                sb1.append(tags + ",");
                sb.setSpan(new ImageSpan(bd),
                        sb.length() - tags.length(), sb.length(),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                sb.setSpan(clickSpan, sb.length() - tags.length(),
                        sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                txtDishTags.setText("");
                txtDishTags.setText(sb);    
                int length = sb.length();
                txtDishTags.setSelection(length, length);
                }
                }
            }
            return false;
        }
    });  

public TextView createContactTextView(String text) {
    //llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 44);
        //llp.setMargins(5, 0, 20, 0);
    TextView tv = new TextView(this);
    tv.setText(text);
    tv.setTextSize(30);     
    Typeface faceBook = Typeface.createFromAsset(getAssets(),
            "fonts/eau_sans_book.otf");
    tv.setTypeface(faceBook);   
    tv.setTextColor(getResources().getColor(R.color.backgroundcolor));
    tv.setBackgroundResource(R.color.textviewbubble);
    //tv.setLayoutParams(llp);
    Resources r = getResources();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            44, r.getDisplayMetrics());
    tv.setHeight(px);
    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);
}  

Я попытался установить границу между текстовым представлением, используя следующий код

 llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 44);
 llp.setMargins(5, 0, 20, 0);
 tv.setLayoutParams(llp);   

Я также установил LeftPadding для Textview, но кажется, что первое текстовое представление не получает его. Даже я установил высоту в текстовое представление, но кажется, что текстовое представление вообще не получает параметр макета. Нравиться

int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
        44, r.getDisplayMetrics());
tv.setHeight(px);

Пожалуйста, дайте ссылку или подсказку.
Заранее спасибо


person Sandip Armal Patil    schedule 26.12.2013    source источник
comment
Вы можете опубликовать свою полную активность?   -  person Kailash Dabhi    schedule 26.12.2013
comment
я уже поставил весь соответствующий код. нет ничего вне этого.   -  person Sandip Armal Patil    schedule 26.12.2013
comment
@SandipArmalPatil, что такое теги? Когда он обновлен?   -  person Amulya Khare    schedule 28.12.2013
comment
когда я нажимаю клавишу поиска на клавиатуре, тег создается. если я снова что-то наберу, а затем снова нажму кнопку поиска, тогда будет создан второй тег.   -  person Sandip Armal Patil    schedule 29.12.2013
comment
@SandipArmalPatil хорошо, пожалуйста, следуйте моему ответу. Это должно решить вашу проблему :)   -  person Amulya Khare    schedule 29.12.2013
comment
@AmulyaKhare: вы сделали с кодом удаления ... я пытаюсь, но не получаю   -  person Sandip Armal Patil    schedule 31.12.2013


Ответы (1)


Есть несколько проблем, которые я определил. Вам нужно внести указанные изменения и все должно заработать.

Шаг 1) Обновите setBounds параметры

В следующей строке измените параметры setBounds с -20 на 0 следующим образом:

BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());

Это важно, потому что вы устанавливаете неправильные границы, что приводит к перекрытию тегов.

Шаг 2. Исправьте ошибку в sb.setSpan

Если вы выполнили шаг 1 и запустили код, вы поймете, что когда вы пытаетесь заменить текст на ImageSpan, вы передаете неправильные значения (вы не принимаете во внимание символ "," (запятая) в конце). Обновите следующую строку, включив в нее -1:

sb.setSpan(new ImageSpan(bd), sb.length() - tags.length() - 1, sb.length() - 1,
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Теперь ваш вывод будет правильным и с запятой посередине.

введите здесь описание изображения

Шаг 3. Добавьте интервал между тегами

Чтобы ответить на ваш первоначальный вопрос, как добавить интервал, я бы порекомендовал вам изменить код, включив ", " между разными интервалами. Вы также можете изменить его, чтобы использовать только " " пробела. Определите переменную contentBetweenTags и установите для нее желаемое значение. Вот как вы можете это сделать:

String contentBetweenTags = ", ";
sb.append(tags + contentBetweenTags);
sb1 = new SpannableStringBuilder();
sb1.append(tags + contentBetweenTags);
sb.setSpan(new ImageSpan(bd), 
           sb.length() - tags.length() - contentBetweenTags.length(), 
           sb.length() - contentBetweenTags.length(), 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Шаг 4) Выбор правильного символа пробела

На всякий случай, если вас не устраивает «маржа/расстояние» между двумя тегами, вы можете использовать один из многих доступны символы пробела Unicode. Они имеют разную ширину, и вы можете использовать любой из них в зависимости от вашего желания / вкуса.

Вот окончательный код и пример снимка экрана с использованием юникода \u2002:

введите здесь описание изображения

BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
String contentBetweenTags = ",\u2002";
sb.append(tags + contentBetweenTags);
sb1 = new SpannableStringBuilder();
sb1.append(tags + contentBetweenTags);
sb.setSpan(new ImageSpan(bd), 
           sb.length() - tags.length() - contentBetweenTags.length(), 
           sb.length() - contentBetweenTags.length(), 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
person Amulya Khare    schedule 28.12.2013
comment
Можете ли вы сделать еще одну услугу... Я хочу удалить тег из построителя составных строк, используя прослушиватель удаления ket, но у меня возникла проблема.... вы также можете добавить код удаления.... - person Sandip Armal Patil; 30.12.2013
comment
что я хочу, предположим, у меня есть два тега в тексте редактирования и некоторый текст ... если я удалю какой-то текст (который не является тегом), и теперь в Edittext теперь есть только теги. если я нажму del, то цвет фона последних тегов изменится, а если я снова нажму del, то последний тег будет удален из построителя строк и наоборот... - person Sandip Armal Patil; 30.12.2013
comment
Кстати, спасибо за помощь. - person Sandip Armal Patil; 30.12.2013
comment
Я должен взглянуть на этот вопрос .. Конечно, нет проблем. - person Amulya Khare; 30.12.2013