0

我想实现一个“收藏夹列表”,假设我有一个空布局。在onCreate()那里super.onCreate(savedInstanceState); setContentView(R.layout.main);,然后我打开一个包含我最喜欢的动物的数据库,加载一些东西并在布局中动态添加按钮。

数据库架构是这样的:
CREATE TABLE animals(_id INTEGER PRIMARY KEY, name TEXT NOT NULL, layout TEXT NOT NULL)

在数据库中有:

_id - - - - - - - - name - - - - - - - - - layout
1 - - - - - - - - -- cat - - - - - - - - -- R.layout.cat
2 - - - - - - - - -- dog - - - - - - - - -- R.layout.dog
3 - - - - - - - - -- turtle - - - - - - - - R.layout.turtle

当然 layouts/xml-files(R.layout.cat, R.layout.dog, R.layout.turtle)是存在的。

然后你会看到三个按钮,分别是猫、狗和乌龟。其中OnClickListener有以下内容:

    Intent intent = new Intent(MyFavorites.this, Animal.class);  
    Log.d ("onClick", button.getmyLayout());  
    // Shows either R.layout.cat, R.layout.dog or R.layout.turtle 
    // depending on what button was pressed. This works fine.
    intent.putExtra("myLayout", button.getmyLayout());    
    // closes the database
    myDbHelper.close();
    startActivity(intent);

可以显示所有的Animal.classanimal-xml 文件,因为它们都具有相同的功能。这就是为什么布局总是传递给同一个类的原因!

动物类:

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            final int myLayout = getIntent().getIntExtra("myLayout", R.layout.main);
            setContentView(myLayout);
        }

现在问题来了。我传递一个字符串而不是一个整数,并且在日志猫中有:

键 myLayout 预期为整数,但值为 java.lang.String。返回默认值 2130903044。

默认值是 R.layout.main,您可以在自动生成R.class的十六进制数字中找到它,十进制是 2130903044。所以我确实理解错误消息。但我想不出另一种方法来解决这个问题。我在考虑getters and settersR.class但当然它们将在下一次构建时被删除。

4

2 回答 2

1

请看这个问题,我认为这是你需要的。基本上你可以通过使用字符串来获取资源......

int i = this.getResources().getIdentifier("cat", "layout", this.getPackageName());

这是 getIdentifier() 的文档

于 2011-09-01T13:41:25.127 回答
1

如果您的布局数量有限且合理(您定义合理的百分比),我建议仅使用静态地图:

static Map<String,Integer> layouts = new HashMap<String,Integer>()
static {
   layouts.put("cat",R.layout.cat);
   ...
   layouts.put("unicorn",R.layout.unicorn);
}

这样,您将获得编译时安全性,并且在运行时会更快。

于 2011-09-01T13:49:40.770 回答