0

我有一个像这样的超类:

public class SuperClass extends Activity

和一个儿童班

 public class ChildClass extends SuperClass

SuperClass 包含一个设置布局的函数

public void setTabBar(String layout){
    inflater.inflate(...., ...); 
}

我的子类和超类中唯一不同的是布局。那么回到我的问题:

无论如何我可以向超类方法发送一个字符串setTabBar("name of the layout");然后指定布局。我试过这个:

public void setTabBar(String layout) {

        int layoutFromString = Integer.parseInt("R.layout."+layout);
        inflater.inflate(layoutFromString, null);
}

但这似乎不起作用。有任何想法吗?

编辑

如前所述,我试过这个:

  public void setTabBar(int id) {
     inflater.inflate(id, null);
  }

适用于超类,但是当我像这样从子类调用函数时:

public class TestClass extends SuperClass{

  @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setTabBar(R.layout.test); 

  }
}

LogCat 只输出这个:

07-23 13:57:15.775: E/AndroidRuntime(7329):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
4

3 回答 3

4
int layoutFromString = Integer.parseInt("R.layout."+layout);

给你一个 NumberFormatException,因为 String "R.layout.yourLayoutId" 不是一个数字,它的字符串。要查找 layoutName 的 id,请使用:

getResources().getIdentifier("YOUR_LAYOUT_NAME",
                "layout", context.getPackageName());
于 2012-07-23T11:49:43.273 回答
1

您正在尝试从传入 setTabBar 的字符串中解析一个整数。将变量名称转换为实际值需要反射,我个人不想踩到那个兔子洞。

为什么不直接指定传入的参数是一个整数呢?

public void setTabBar(int layoutId) {
    inflater.inflate(....,....);
}

并且,在调用类中:

activity.setTabBar(R.layout.nifty_layout);
于 2012-07-23T11:53:38.930 回答
0

像这样的东西应该工作:

public abstract class SuperClass extends Activity{
    public void setTabBar(String layout){
        inflater.inflate(getResId(), null); 
    }

    protected abstract int getResId();
}

public class ChildClass extends SuperClass{
    @Override
    protected abstract int getResId(){
        return R.layout.child;
    }
}

我不确定这是你想要的。我希望这能帮到您。

于 2012-07-23T11:54:39.320 回答