Учитывая два поля метки внутри HorizontalFieldManager, как мне сделать, чтобы отобразить полный текст со второй метки без его переноса?

У меня есть HorizontalFieldManager с двумя метками внутри. Левая метка показывает описание, а правая показывает сумму денег.

Для меня более важно показать полный текст второго ярлыка. Проблема в том, что если первая метка слишком длинная, вторая метка будет обернута. Я хочу избежать этого, поэтому текст со второй метки всегда отображается. Мне также нужно избегать наложения на первую метку в этом случае, поэтому текст с этой метки обрезается и заполняется точками.

Вот как выглядит HorizontalFieldManager:

И вот что мне нужно получить:

Как мне это сделать?

Заранее спасибо!

2 ответа

Решение

Если вы создаете свой LabelField с LabelField.ELLIPSIS флаг, оно будет усекать поле с . персонажи. Я бы порекомендовал вам использовать кастом Manager подкласс (вместо HorizontalFieldManager) решить, какая правильная ширина у вас двоих LabelFields должно быть. Вы можете сделать это, спросив, какова правильная ширина суммы в долларах, учитывая текущий шрифт.

Попробуйте этот пример:

public class LabelAlignScreen extends MainScreen {

   private LabelField description;
   private LabelField balance;
   private static final int MARGIN = 8;  // used for x and y

   public LabelAlignScreen() {
      super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);

      Manager row = new RowManager(Manager.USE_ALL_WIDTH);
      description = new LabelField("This is a very looooooooooong description", 
            LabelField.ELLIPSIS);
      row.add(description);
      balance = new LabelField("1,500,000,000 USD");
      row.add(balance);
      add(row);
   }

   private class RowManager extends Manager {
      public RowManager(long flags) {
         super(flags);
      }

      protected void sublayout(int width, int height) {
         // first, determine how much space the balance field needs
         int balanceWidth = balance.getFont().getAdvance(balance.getText());
         // description field gets leftover width, 
         //   minus a margin at left, center and right
         int descriptionWidth = width - balanceWidth - 3 * MARGIN;

         setPositionChild(description, MARGIN, MARGIN);
         layoutChild(description, descriptionWidth, description.getPreferredHeight());

         setPositionChild(balance, MARGIN + descriptionWidth + MARGIN, MARGIN);
         layoutChild(balance, balanceWidth, balance.getPreferredHeight());  

         setExtent(width, getPreferredHeight());
      }

      public int getPreferredHeight() {
         return Math.max(balance.getPreferredHeight(), description.getPreferredHeight()) + 2 * MARGIN;
      }

      public int getPreferredWidth() {
         return Display.getWidth();
      }
   }
}

Примечание: вы не указали, должно ли поле доллар / баланс быть фиксированной ширины или всегда едва достаточным для размещения текста. Я предположил, что он должен просто не вписываться в текст, так как я думаю, что в большинстве случаев это улучшает компоновку. Кроме того, мой код выше использует жестко MARGIN значение для пространства вокруг всех полей. Вы можете настроить это, если хотите.

Результаты

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

Посмотрите на этот пример:

class Test {
    public String StringShorter(String field, int maxsize) {
    //create a function that process the String you want to put in your field
    StringBuilder strb=new StringBuilder();
    // lets say you want your field to not more than 10 characters

        if(field.length()>=maxsize) {
            strb.append(field.substring(0,maxsize));
            strb.append("...");
        }
        return strb.toString();
    }

    public static void main(String[] args) {
        Test sl=new Test();
        System.out.println(sl.StringShorter("sdadasfdfsdfsdfsdfdsffdfs", 10)); 
        // define the maximum characters here it is defined to be maximum 10 characters
        }
    }

результат будет:

sdadasfdfs...
Другие вопросы по тегам