2016-01-17 3 views
0

У меня есть кнопка в горизонтальной компоновке (см. 1-е изображение). Когда я меняю свой текст (программно), андроид пытается настроить их, но иногда результат ужасен (см. 2-е изображение). Я бы хотел, чтобы последняя кнопка была другой строкой, но мне это не удалось. (См 3-й рисунок)Как настроить макет, когда текст кнопки изменяется программно в Android?

enter image description here

+0

У вас нет фиксированных данных? –

+1

Вы должны отредактировать свой макет со всеми возможными «краевыми случаями» в ваших текстах. Когда вы дойдете до ОДНОГО макета, который хорош для всех возможностей, тогда все готово. Теперь вы используете этот макет, и андроид позаботится о перемещении виджетами в соответствии с макетом – Gavriel

ответ

1

Наконец-то я получил его. Ключ использовать TextView и сделать его текст SpannableStrings: Это код:

Интерфейс:

public interface IClickSpannableListener { 
    void onClickSpanText(SpecialClickableSpan sender); 
} 

Класс:

import android.text.TextPaint; 
import android.text.style.ClickableSpan; 
import android.view.View; 

public class SpecialClickableSpan extends ClickableSpan { 
    private IClickSpannableListener oyente; 
    private String text; 
    private RoundedBackgroundSpan roundedBackgroundSpan; 

    //region get  
    public String getText() { 
     return text; 
    } 
    public RoundedBackgroundSpan getRoundedBackgroundSpan() { 
     return roundedBackgroundSpan; 
    } 
    //endregion 

    //region constructor 
    public SpecialClickableSpan(String text,IClickSpannableListener quien,boolean isRoundedBackgroundSpam){ 
     super(); 
     //IMPORTANT: Replace space (alt + 255) by asc 32. 
     this.text = text.replace(' ',' '); 
     if (isRoundedBackgroundSpam){ 
      roundedBackgroundSpan=new RoundedBackgroundSpan(); 
     } 
     oyente =quien; 
    } 
    //endregion 

    //region mustOverride 
    @Override 
    public void onClick(View widget) { 
     oyente.onClickSpanText(this); 
    } 
    //endregion 

    public void updateDrawState(TextPaint ds) {// override updateDrawState 
     ds.setUnderlineText(false); // set to false to remove underline 
    } 
} 

и, наконец, в своей деятельности:

public class MyActivity extends Activity 
    implements IClickSpannableListener{ 

    public void onClickSpanText(SpecialClickableSpan sender) { 
    System.out.println(sender.getText()); 
    switch (sender.getText()){ 
     case "50 pence": //do something 
     break; 
     //... 
     case else: 
     //.... 
    } 

    private void setSpannableWords(String wordsWithToken){ 
     wordsWithToken=" 50 pence front page massive There's a history "; //for this example 
      //IMPORTANT between «50» and «pence», «front» and «page», and also between «there's» and «a» and «history» 
      //THERE ISN'T space (asc 32), there is ALT+255. This avoid wordwrap in those texts 
     SpannableString spannableString=new SpannableString(wordsWithToken); 
     int inicio=wordsWithToken.indexOf(" ")+3; 
     while (inicio>2){ 
      int fin=wordsWithToken.indexOf(" ",inicio); 
      if (fin>-1){ 
       SpecialClickableSpan specialClickableSpan=new SpecialClickableSpan(wordsWithToken.substring(inicio,fin),this,true); 
       spannableString.setSpan(specialClickableSpan, inicio, fin, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
       spannableString.setSpan(specialClickableSpan.getRoundedBackgroundSpan(), inicio, fin, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
       inicio=fin; 
      } 
      inicio=wordsWithToken.indexOf(" ",inicio+2)+1; 
     } 
     TextView textView=((TextView)findViewById(R.id.tvWordText)); 
     if (textView.getMovementMethod()==null) { 
      textView.setMovementMethod(LinkMovementMethod.getInstance()); 
      textView.setHighlightColor(Color.TRANSPARENT); 
     } 
     textView.setText(spannableString); 
    } 


} 

и это результат: enter image description here

Редактировать: Извините, я забыл класс RoundedBackgroundSpan. Вот как это делается:

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.text.style.ReplacementSpan; 


public class RoundedBackgroundSpan extends ReplacementSpan { 

    private static int CORNER_RADIUS = 8; 
    private int backgroundColor = Color.CYAN; 
    private int textColor = Color.BLACK; 

    public RoundedBackgroundSpan() { 
     super(); 
    } 

    @Override 
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { 
     if (top==0){ 
      top=4; 
     } 
     top+=2; 
     RectF rect = new RectF(x-3, top, x + measureText(paint, text, start, end)+3, bottom); 
     paint.setColor(backgroundColor); 
     canvas.drawRoundRect(rect, CORNER_RADIUS, CORNER_RADIUS, paint); 
     paint.setColor(textColor); 
     canvas.drawText(text, start, end, x, y, paint); 
    } 

    @Override 
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { 
     return Math.round(paint.measureText(text, start, end)); 
    } 

    private float measureText(Paint paint, CharSequence text, int start, int end) { 
     return paint.measureText(text, start, end); 
    } 
} 
0

LinearLayout предназначен, чтобы только одна строка/столбец элементов. Если вы хотите описать поведение строк, которые вы описываете, вы можете создать пользовательскую реализацию ViewGroup или использовать стороннюю библиотеку, например https://github.com/ApmeM/android-flowlayout

Если эти кнопки представляют собой совокупность похожих объектов, которые взаимодействуют единообразно, то должен работать и GridView.

+0

Спасибо. Я попытаюсь создать пользовательскую группу viewGroup –

Смежные вопросы