Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在模型对象中引用Strings.XML以支持本地化_Android_Resources_Localization_Model - Fatal编程技术网

Android 在模型对象中引用Strings.XML以支持本地化

Android 在模型对象中引用Strings.XML以支持本地化,android,resources,localization,model,Android,Resources,Localization,Model,我发现这个问题的答案和讨论都不清楚 我是Android新手,我试图理解如何在模型类中引用我的资源字符串,以便能够正确地支持本地化 具体来说,我的模型有一个Location属性,我希望能够为方位的指南针序号返回一个字符串。因为像“North”这样的指南针序号需要本地化,所以我尝试将它们存储在strings.xml中 我想我知道我需要应用程序上下文来访问resources对象,但我想知道这是否可能,而不必传入上下文。在模型中存储UI上下文似乎违反了MVC 为了实现这一点,我想在我的模型中包括这样一个

我发现这个问题的答案和讨论都不清楚

我是Android新手,我试图理解如何在模型类中引用我的资源字符串,以便能够正确地支持本地化

具体来说,我的模型有一个Location属性,我希望能够为方位的指南针序号返回一个字符串。因为像“North”这样的指南针序号需要本地化,所以我尝试将它们存储在strings.xml中

我想我知道我需要应用程序上下文来访问resources对象,但我想知道这是否可能,而不必传入上下文。在模型中存储UI上下文似乎违反了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;
}
public String compassOrdinalForBearing(浮动轴承){
断言轴承>=0.0&&336.5&&0&&22.5&&67.5&&112.5&&157.5&&202.5&&247.5&&292.5&&
但我想知道这是否可能,而不必传递上下文

不,您确实需要传入上下文


我认为您需要本地化字符串资源的唯一地方是向用户显示一些UI。UI始终是某些
活动
(也就是
上下文
)的一部分,因此,当您需要获取模型的本地化字符串时,使用
上下文
实例应该不是问题。

通常所做的是对应用程序类进行子类化,这保证只有一个实例

应用程序子类:

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">
最后,这两者的一种混乱组合,以防在实例化时确实无法在上下文中传递,并且不希望将应用程序上下文保留在应用程序子类中:

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”,第一个条件必然是真的

例如:

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

如果((轴承>=0)和((轴承22.5)和(如果我创建了500个模型实例,那么在每个模型中存储一个上下文实例是正常的吗?@Nick:当然,你不应该在模型中保留对上下文实例的引用。你只需要它来为模型生成UI表示。所以活动中的一些代码应该能够从模型中获取本地化的UI表示。要获取
参考资料
实例您需要
上下文
实例。要优化代码,您可以将
资源
实例传递给模型,而不是
上下文
实例。这可能是我收到的最有帮助的答案。感谢您详细介绍不同的方法。应用程序子类化符合我的需要现在很好。在If块上,我只是清楚地解释了范围,但是的,这并不是评估事物的最有效的方法——在可读性和效率之间取得平衡总是很棘手的,这是一个最小化这一点的好方法。再次感谢您的精彩评论。
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";