如何从库中引用库的字符串资源

时间:2015-12-05 13:22:27

标签: java android

我已阅读[问题15557913] :( How to reference a string in strings.xml of an Android library in code?)和 How to reference a string from another package in a library using XML in Android?

但我仍感到困惑.... 如果我理解正确的话,应用程序的R和库中的一个被合并,因此即使在库中使用带有应用程序上下文的R,我也应该得到我的资源....

(在评论之后,我现在发布原始程序流程),所以我有

UtilsApp/app -in fact a test app for the utils
        /nohutils/../src/../Command.java collection of utils e.g. this class
                 /res

NohFibu/app 
           /src with the MainActivity e.g. context...
           /res
       /jfibu/src../FibuCommand extends Command library of utils building on nohutils
             /res

MainActivity:

package com.nohkumado.nohfibu;
import com.nohkumado.nohfibu.R;

public class MainActivity extends Activity implements MsgR2StringI
{
  ....
  ShellI console = null;
  ....
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    ....
    if (console == null)  console = new Shell(this);
    else console.setContext(this);
    ....

    HashMap<String,CommandI> cmds = new HashMap<String,CommandI>();
    cmds.put("1", new EditJrlCmd(console));
    cmds.put("2", new EditKplCmd(console));
    ... etc ... 

    @Override
    public String msg(int stringid)
    {
     try
     {  
        return(getResources().getString(stringid));
     }
     catch (Resources.NotFoundException e)
     { Log.e(TAG, "not found message : " + stringid);}
     return("MSGNOTFOUND");
    }
    ...

现在我在FibuCommand中有一个方法:

package com.nohkumado.jfibu.commands;
public class FibuCommand extends Command 
{
  public FibuCommand(ShellI s)
  {
    super(s);
  }// public EditJrlCmd()
  public String msg(int resourceId)
  {
    MsgR2StringI msger = (MsgR2StringI) shell.get("msger");
    return(msger.msg(resourceId));      
  }// public String msg(String m)

和最后:

package com.nohkumado.nohutils;
public class Command implements CommandI 
{
  ....
  protected ShellI shell = null;
  ...
  public Command(ShellI s)
  {
    shell = s;
  }// public Command()

package com.nohkumado.nohutils;
public class Shell implements ShellI,OnEditorActionListener,OnKeyListener
{
  ....
  protected MsgR2StringI context = null;
  ....
  public Shell(MsgR2StringI c)
  {
    super();
    context = c;
    ....
  }// public Shell()

现在当我尝试调用msg(R.string.nofibuobj)时;我的IDE告诉我'com.nohkumado.nohutils.R.string'的未知成员'nofibuobj'错误 但是如果我写了msg(com.nohkumado.jfibu.R.string.nofibuobj),IDE会停止抱怨,但是在exe时间我会得到一个丑陋的MSGNOTFOUND ....

但是在com.nohkumado.nohfibu包的上下文中的com.nohkumado.jfibu.com包中调用了msg方法,该方法继承自com.nohkumado.nohutils包的类。

我只想要一个包com.nohkumado.jfibu(和子包)来访问com.nohkumado.jfibu.R.string中的资源....如何实现?

提前谢谢! 乙

2 个答案:

答案 0 :(得分:0)

确定, 而不是将msg方法放在FibuCommand中,我将它放入应用程序的MainActivity,它的工作原理....不能说为什么

为了缩短调用,我必须明确地导入库项目的R,即使文档说我不应该,但它是摆脱完全限定命名的唯一方法......

答案 1 :(得分:0)

&#34;问题&#34;是MainActivityFibuCommand在不同的Java包中。我建议你了解一下包和import声明。

请注意,还有另一个名为R的类。这通常与MainActivity位于同一个包中。确切的包名称在AndroidManifest.xml中声明为package标记中的<application>属性,或build.gradleapplicationId中的defaultConfig。每当您在与此根包不同的包中创建类时,您必须具有import的{​​{1}}语句。这实际上与使用来自不同包的任何其他类没有什么不同。