Ссылка на Strings.XML в объекте модели для поддержки локализации - PullRequest
2 голосов
/ 05 октября 2011

Я нахожу принятый ответ и обсуждение этого SO вопроса getString Вне контекста или действия неясно.

Я новичок в Android и пытаюсь понятькак я могу ссылаться на мои строки ресурсов в классе модели, чтобы я мог правильно поддерживать локализацию.

В частности, моя модель имеет свойство Location, и я хотел бы иметь возможность вернуть строку для порядкового номера компаса дляподшипник.Поскольку ординалы компаса, такие как «Север», должны быть локализованы, я пытаюсь сохранить их в своем strings.xml.

Мне кажется, я понимаю, что мне нужен контекст приложения, чтобы добраться до объекта ресурсов, но яинтересно, возможно ли это без передачи контекста. Сохранение контекста интерфейса в модели кажется нарушением MVC.

Чтобы добиться этого, я хотел включить в свою модель такой метод.Первый if показывает, как я пытаюсь использовать запись strings.xml.

public String compassOrdinalForBearing(float bearing) {

assert bearing >= 0.0 && bearing <= 360.0;

if ((bearing > 336.5) && (bearing <= 360.0))
    //Problem here
    return Context.getResources().getString(R.string.compass_ordinal_north);
else if ((bearing >= 0) && (bearing <= 22.5))
    return "North";
else if ((bearing > 22.5)  && (bearing <= 67.5))
    return "Northeast";
else if ((bearing > 67.5)  && (bearing <= 112.5))
    return "East";
else if ((bearing > 112.5) && (bearing <= 157.5))
    return "Southeast"; 
else if ((bearing > 157.5) && (bearing <= 202.5))
    return "South";
else if ((bearing > 202.5) && (bearing <= 247.5))
    return "Southwest";
else if ((bearing > 247.5) && (bearing <= 292.5))
    return "West";
else if ((bearing > 292.5) && (bearing <= 337.5))
    return "Northwest";
else
    assert false;
    return null;
}

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Часто делается подкласс класса приложения, который гарантированно имеет только один экземпляр.

Подкласс приложения:

public class MyApplication extends Application {
   private static Context mContext;

   @Override
   public void onCreate(){
      super.onCreate();
      mContext = this;
   }

   public static Context getContext(){
        return mContext;
   }
}

Ваш класс:

public String compassOrdinalForBearing(float bearing) {
    Context context = MyApplication.getContext();

    String north = context.getResources().getString(R.string.compass_ordinal_north);)
}

Но не забудьте изменить манифест:

<application android:name="com.example.myapp.MyApplication">

В качестве альтернативы вы можете просто передать контекст во время создания экземпляра, не сохраняя указатель на него, так как почти наверняка эти объекты будут созданы из контекста,

private Static string NORTH = null;

public MyClass(Context context){
    initializeDirections(context);
}

private static void initializeDirections(Context context){
    if(NORTH == null){
        NORTH = context.getResources().getString(R.string.compass_ordinal_north);
    }
}

Наконец, это некая грязная комбинация двух на тот случай, если вы действительно не можете передать контекст при создании экземпляра и не хотите сохранять контекст приложения в подклассе Application:

public class MyApplication extends Application {
    @Override
    public void onCreate(){
        super.onCreate();
        MyClass.initializeDirections(this);
    }
}

public class MyClass{
    private static String NORTH = null;

    public static final void initializeDirections(Context context){
        NORTH = context.getResources().getString(R.string.compass_ordinal_north);
    }
}

Редактировать: На несвязанной ноте, по крайней мере, только из этого единственного фрагмента, вы можете убить все первые условные выражения.Если он достиг этого конкретного «иного», первое условие обязательно будет верным.

Например:

else if ((bearing >= 0) && (bearing <= 22.5))
    return "North";
else if ((bearing > 22.5)  && (bearing <= 67.5))
    return "Northeast";

Может быть:

else if (bearing <= 22.5)
    return "North";
else if (bearing <= 67.5)
    return "Northeast";

Как если бы bearing было! <= 22,5, оно обязательно> 22,5.

Это может или не может улучшить читаемость для вас и может или не может быть желательным для вас.Просто некоторые, вероятно, нежелательные два цента:)

0 голосов
/ 05 октября 2011

но мне интересно, возможно ли это без необходимости передавать контекст в

Нет, вам нужно передать контекст в.

Полагаю,единственное место, где вам нужны локализованные строковые ресурсы - это некоторый пользовательский интерфейс, который будет представлен пользователям.Пользовательский интерфейс всегда является частью некоторого Activity (который также Context), поэтому не должно быть проблемой наличие экземпляра Context, когда вам нужно получить локализованные строки для вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...