У меня есть кнопка в горизонтальной компоновке (см. 1-е изображение). Когда я меняю свой текст (программно), андроид пытается настроить их, но иногда результат ужасен (см. 2-е изображение). Я бы хотел, чтобы последняя кнопка была другой строкой, но мне это не удалось. (См 3-й рисунок)Как настроить макет, когда текст кнопки изменяется программно в Android?
ответ
Наконец-то я получил его. Ключ использовать 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);
}
}
Редактировать: Извините, я забыл класс 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);
}
}
LinearLayout
предназначен, чтобы только одна строка/столбец элементов. Если вы хотите описать поведение строк, которые вы описываете, вы можете создать пользовательскую реализацию ViewGroup или использовать стороннюю библиотеку, например https://github.com/ApmeM/android-flowlayout
Если эти кнопки представляют собой совокупность похожих объектов, которые взаимодействуют единообразно, то должен работать и GridView.
Спасибо. Я попытаюсь создать пользовательскую группу viewGroup –
- 1. Android, программно макет кнопки просмотра?
- 2. Android Программно задающий текст кнопки
- 3. Когда макет подпроектов программно в Android
- 4. Android - удаленный макет программно
- 5. Пользовательский макет кнопки в android
- 6. Android: Как настроить размер текста кнопки на диалоге программно?
- 7. Как настроить текст текста программно
- 8. TextView перемещает одну строку вниз, когда текст изменяется программно
- 9. Facebook login Текст кнопки не изменяется
- 10. Как настроить макет главного меню в Android?
- 11. Высота кнопки Android (программно)
- 12. Как программно изменить текст кнопки?
- 13. программно задает свойство «Макет справа» в android
- 14. Как настроить макет, когда экранная клавиатура появляется
- 15. Android: Как покрыть весь макет по виду программно, в то время как макет содержит кнопки уже?
- 16. Как настроить кнопки в Android?
- 17. настроить кнопки программно не работает
- 18. Как настроить App Theme программно в Android?
- 19. SimpleCursorTreeAdapter - Как настроить макет ребенка
- 20. Android: setbackground макет кнопки
- 21. Как настроить пользовательский текст для кнопки в Android?
- 22. Как настроить текст кнопки действия на клавиатуре в Android
- 23. Как сохранить измененный текст кнопки в android?
- 24. Как настроить макет, когда на Android-клавиатуре появляется мягкая клавиатура?
- 25. Настроить текст в пункте всплывающего меню программно
- 26. Как макет кнопки
- 27. Android: Как программно настроить drawablePadding?
- 28. Макет 4 кнопки в Android
- 29. Программно заданный макет для android
- 30. Как настроить фокус на виджет кнопки программно?
У вас нет фиксированных данных? –
Вы должны отредактировать свой макет со всеми возможными «краевыми случаями» в ваших текстах. Когда вы дойдете до ОДНОГО макета, который хорош для всех возможностей, тогда все готово. Теперь вы используете этот макет, и андроид позаботится о перемещении виджетами в соответствии с макетом – Gavriel