Передача идентификаторов макета динамически - PullRequest
0 голосов
/ 01 сентября 2011

Я хочу реализовать «список избранного», и давайте предположим, что у меня есть пустой макет.На 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<br> 1 - - - - - - - - -- cat - - - - - - - - -- R.layout.cat<br> 2 - - - - - - - - -- dog - - - - - - - - -- R.layout.dog<br> 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);
        }

Теперь вот проблема.Я передаю String, а не Integer, и в журнале cat есть:

Ключ myLayout ожидается Integer, но значением является java.lang.String.Возвращено значение по умолчанию 2130903044.

Значением по умолчанию является R.layout.main, который вы найдете в автоматически сгенерированном R.class как шестнадцатеричное число, а в десятичном формате - 2130903044. Поэтому я понимаюсообщение об ошибке.Но я не могу придумать другой способ решить эту проблему.Я думал о getters and setters в R.class, но, конечно, они будут удалены при следующей сборке.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Если ваше количество макетов конечно и разумно (вы определяете разумный%), я бы предложил использовать просто статическая карта:

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

Таким образом, вы получите безопасность во время компиляции, и это будет быстрее во время выполнения.

1 голос
/ 01 сентября 2011

Пожалуйста, посмотрите этот вопрос, я думаю, это то, что вам нужно.По сути, вы можете получить ресурс, используя строку ...

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

И здесь - документация для getIdentifier ().

...