Как в Java ME изменить направление отображаемого материала, чтобы он шел справа налево только для моего мидлета?

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

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


person inor    schedule 17.02.2012    source источник


Ответы (1)


Предполагая, что вы используете 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;
    }
person Jason Fox    schedule 17.01.2013
comment
Примечание. Если целевое устройство поддерживает JSR 238 Мобильный I18N API, могут быть и другие варианты - person gnat; 18.01.2013