Поиск правильного идентификатора элемента R.id. * в нескольких файлах макета XML - PullRequest
0 голосов
/ 04 января 2012

У меня есть приложение, идентификатор пакета - com.MYAPP, а затем я создаю новый пакет с именем com.reference и внутри него есть файл ViewCache. Сначала генерируется ошибка на findViewById (R.id.text) и findViewById (R.id.image), поэтому мне пришлось импортировать com.MYAPP.R, чтобы избавиться от ошибок. Но в папке Layout у меня есть много файлов макетов .xml, которые могут использовать id = R.id.text и R.id.image. Я подумал, что мне нужно указать конкретный xml, на который указывает, чтобы ViewCache точно знал, какой xml он использовал. Я подумал, что мне нужно импортировать com.MYAPP.R.row_item.xml.

У меня также есть mainapp.xml, который использует id.text и id.view.image в папке макета. но это НЕ позволило бы мне указать импорт com.MYAPP.R.row_item.xml.

Итак, что я должен указать при импорте? Я думаю, что импорт com.MYAPP.R недостаточно.

package com.reference;

import com.MYAPP.R;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewCache {

private View baseView;
private TextView textView;
private ImageView imageView;

public ViewCache(View baseView) {
    this.baseView = baseView;
}

public TextView getTextView() {
    if (textView == null) {
        textView = (TextView) baseView.findViewById(R.id.text);
    }
    return textView;
}

public ImageView getImageView() {
    if (imageView == null) {
        imageView = (ImageView) baseView.findViewById(R.id.image);
    }
    return imageView;
}

}

1 Ответ

1 голос
/ 04 января 2012

Для пояснения некоторых имен: То, что вы называете идентификатором пакета (com.MYAPP), является пакетом вашего приложения (который определен в файле манифеста).

Файл R.java содержит все идентификаторы, созданные из ваших ресурсов,Он расположен в <application-package>.R (так в вашем случае com.MYAPP.R).Если вы определите один и тот же идентификатор в файле с несколькими макетами, это приведет к одному идентификатору в файле R.

findViewById(id) ищет в дочернем представлении с указанным идентификатором.Он НЕ ищет представление с этим идентификатором во всех файлах макета.

Если вы, например, делаете следующее:

public class MyActivity extends Activity {
 public void onCreate(Bundle b) {
   super.onCreate(b);
   this.setContentView(R.layout.myView); // you set the view here
   TextView tv = (TextView) findViewById(R.id.text); // this looks in the layout myView for an item with id text
 }
}

В вашем примере findViewById(..) будет искать дочернее представлениес идентификатором text в пределах baseView.Только в baseView будет выполняться поиск элемента с идентификатором text, а не в любом другом макете.Таким образом, результат findViewById(..) зависит от того, что вы назначаете для baseView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...