2011-09-01 88 views
0

我想實現「最喜歡的列表」,假設我有一個空的佈局。在onCreate()super.onCreate(savedInstanceState); setContentView(R.layout.main);,然後我用我最喜歡的動物打開一個數據庫,加載一些東西並動態添加按鈕到佈局。動態傳遞佈局ID

數據庫模式是這樣的:
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

當然的佈局/ XML的文件(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.class可以顯示所有動物XML的文件,因爲它們都具有相同的功能。這就是爲什麼佈局總是傳遞給同一個類的原因!

的Animal.class:

@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.所以,我明白了錯誤信息。但我想不出解決這個問題的另一種方法。我在考慮R.class中的getters and setters,但當然它們將在下一次構建時被刪除。

回答

1

請參閱this問題,我認爲這是你需要的。基本上,你可以使用字符串獲取資源...

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

而且here是則getIdentifier的文檔()。

+0

非常好!謝謝! – BenjaminButton

1

如果你的佈局的量是有限的,合理的(你定義合理%),我會建議使用 只是靜態地圖:

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

這樣你會得到編譯時的安全性,而且會更快在運行時。

+0

感謝您的回答,Konstantin Pribluda。我會牢記它! – BenjaminButton