В Java ME, как я могу изменить направление отображаемого материала, чтобы он шел справа налево только для моего мидлета? - PullRequest
2 голосов
/ 18 февраля 2012

Мой Java ME MIDlet позволяет пользователю изменять язык мидлета.
Мой код обрабатывает интернационализацию, и он отлично работает для языков слева направо.
Но когда пользователь меняет язык наЯзык справа налево, правильные строки отображаются, но экраны остаются выровненными по левому краю.

Другими словами, локаль телефона en_US, и я не хочу ее менять.
Я просто хочу изменить локаль моего мидлета.
Какой самый простой способ динамически изменить все экранымидлета, чтобы выровнять их содержимое по правому краю?
Я не против, если решение включает в себя перезапуск приложения пользователем.
Я также не против, если решение является проприетарным для телефонов Nokia, если его нет.Решение Java ME.

1 Ответ

1 голос
/ 17 января 2013

Если вы используете LCDUI, по умолчанию StringItems и т. Д. Будет задано расположение по умолчанию в зависимости от локали телефона. то есть Item.LAYOUT_DEFAULT, это означает, что телефон с языком en_US будет отображать элементы слева направо, тогда как телефон с языком ar_EG будет отображать текст справа налево.

Однако можно принудительно макет выровнять текст по правому краю с помощью функции setLayout():

StringItem myStringItem  = new StringItem("Title", "The text I want to display", Item.PLAIN);
myStringItem.setLayout(Item.LAYOUT_RIGHT);
append(myStringItem );

Вы можете легко создать одноэлементный класс Settings, который может содержать флаг со значением, используемым для выравнивания (Item.LAYOUT_LEFT или Item.LAYOUT_RIGHT), и вызывать его при настройке макета, например ::

myStringItem.setLayout(Settings.getInstance().getJustification());

Это также можно сделать в конструкторе, если хотите.

Для низкого уровня Graphics можно использовать метод drawString() и изменить направление текста, но вам нужно будет вычислить начальную точку в верхнем правом углу вашего текста, а не в верхнем левом

  if (Settings.getInstance().getJustification() != Item.LAYOUT_RIGHT ) {
       g.drawString("Some Text", x + TEXT_MARGIN , y ,Graphics.TOP | Graphics.LEFT);
  } else {
       // Arabic rendering of menu items - getWidth() is the maximum length
       // of the line 
       g.drawString("Some Arabic Text",  x + getWidth() - TEXT_MARGIN, y ,
                            Graphics.TOP | Graphics.RIGHT);
  }

Самое простое решение (от которого вы уже отказались) будет использовать Item.LAYOUT_DEFAULT повсюду и изменять локаль телефона (конечно), но вам все равно нужно будет использовать переопределение для drawString(), если вы используете низкий уровень графики.

Чтобы проверить правильность выравнивания, я бы ввел язык ввода, используя System.getProperty("microedition.locale"), в такую ​​функцию, как эта:

 static final String[] RIGHT_TO_LEFT = {
        "ar", // Arabic
        "az", // Azerbaijani
        "he", // Hebrew
        "jv", // Javanese
        "ks", // Kashmiri
        "ml", // Malayalam
        "ms", // Malay
        "pa", // Panjabi
        "fa", // Persian
        "ps", // Pushto
        "sd", // Sindhi
        "so", // Somali
        "tk", // Turkmen
        "ug", // Uighur
        "ur", // Urdu
        "yi" // Yiddish
    };

 public static int getJustification(String locale) {

        for (int index = 0; index < RIGHT_TO_LEFT.length; index++) {
            if (locale.indexOf(RIGHT_TO_LEFT[index]) != -1) {
                return Item.LAYOUT_RIGHT;
            }
        }
        return Item.LAYOUT_DEFAULT;
    }
...