findViewById () возвращает null – попробовал ВСЕ
Я сдаюсь … даже мой профессор не знает, почему это происходит.
Проблема в том, что независимо от того, где и как я вызываю компоненты этого макета, они всегда возвращают значение null.
LAYOUT: search_layout. 2 EdiText и 2 детей TextView.
- Как исправить ошибку: разметка в документе, следующая за корневым элементом, должна быть хорошо сформирована
- oracle plsql: как анализировать XML и вставлять в таблицу
- Разрешены ли разрывы строк в значениях атрибутов XML?
- Как использовать NSXMLParser для синтаксического анализа элементов parent-child с одинаковым именем
- Требуется наличие пробелов между publicId и systemId
RUNTIME: setView(inflater.inflate(R.layout.search_layout, null)) // works fine, it displays the layout inside the dialog, yet, children are always returned as null by findViewById(R.id.some_search_layout_children)
ИСКЛЮЧЕНИЕ: Разбор исключений XML, поскольку ресурс не найден, следовательно, null.
TRIED: очистил мой проект примерно в 1024 раза, попытался реализовать еще один class для моего диалогового windows, тот же результат, который называется findViewById, как член моей основной деятельности, внутри метода initSearch () и внутри анонимной реализации OnClickListener для моего диалога, SAME РЕЗУЛЬТАТ. Сломал детей в независимых взглядах и программно назвал их:
TextView text = (TextView) findResourceById(R.id.new_independant_textview); // same result
Кажется, я все пробовал.
Это мой код:
public class Xyz extends Activity { public void onCreate(...) { // some listener will trigger initSearch() } private void initSearch() { AlertDialog.Builder searchDialog = new AlertDialog.Builder(this); LayoutInflater inflater = this.getLayoutInflater(); searchDialog.setTitle("Search Photos"); searchDialog.setMessage("Specify tag and value..."); // R.layout.search_dialog is my custom layour, it displays fine, it works. searchDialog.setView(inflater.inflate(R.layout.search_dialog, null)); EditText tagText = (EdiText) findViewById(R.id.tagField); // WILL RETURN NULL searchDialog.setPositiveButton( ... ) ... searchDialog.show(); }
Теперь, когда я это делаю:
EditText text = (EditText) findViewById(R.id.tagField); // returns null, ALWAYS // no matter HOW, WHERE, global, local final, etc, it just returns null.
Вот XML моего пользовательского макета:
Это мой файл R.java:
public static final class id { public static final int action_settings=0x7f0a0011; public static final int add_album=0x7f0a0001; public static final int add_photo=0x7f0a000d; public static final int albums_list=0x7f0a0003; public static final int delete_album=0x7f0a000b; public static final int exit_finder=0x7f0a000f; public static final int new_directory=0x7f0a000e; public static final int open_album=0x7f0a000a; public static final int photos_grid=0x7f0a0000; public static final int rename_album=0x7f0a000c; public static final int search_dialog=0x7f0a0004; public static final int search_icon=0x7f0a0002; public static final int splash_rutgers=0x7f0a0009; public static final int tagField=0x7f0a0006; // problematic public static final int tagText=0x7f0a0005; / problematic public static final int terminate_app=0x7f0a0010; public static final int valueField=0x7f0a0008; // problematic public static final int valueText=0x7f0a0007; // problematic }
Спасибо за вашу помощь, счастливая охота.
- Как разобрать XML с помощью jsoup
- В чем разница между SAX и DOM?
- Чтение больших XML-документов в .net
- Обновления просмотра списка Android
- Какой XML-парсер следует использовать в C ++?
- Как разбирать тег с тем же именем в Android XML DOM Parsing
- Java-анализ XML-документа дает «Недопустимый контент в prologе». Error
- Как читать и писать xml-файлы?
Вызов findViewById()
будет искать виды в макете вашей деятельности, а не в вашем диалоговом окне. Вам нужно вызвать findViewById()
на конкретном View
которое вы задали в качестве макета вашего диалогового windows.
Попробуй это
private void initSearch() { AlertDialog.Builder searchDialog = new AlertDialog.Builder(this); LayoutInflater inflater = this.getLayoutInflater(); searchDialog.setTitle("Search Photos"); searchDialog.setMessage("Specify tag and value..."); // R.layout.search_dialog is my custom layour, it displays fine, it works. View dialogView = inflater.inflate(R.layout.search_dialog, null); searchDialog.setView(dialogView); EditText tagText = (EdiText) dialogView.findViewById(R.id.tagField); searchDialog.setPositiveButton( ... ) ... AlertDialog myAlert = searchDialog.create(); //returns an AlertDialog from a Builder. myAlert.show(); }
Обратите внимание, как я раздуваю представление и сохраняю его в View
named dialogView
. Затем, чтобы найти ваш EditText
именем tagField
, я использую dialogView.findViewById(R.id.tagField);
TextView
с id text123
должен быть объявлен внутри Layout
, установленного с помощью setContentView
Ваша проблема в том, что вы пытаетесь сделать .show()
в AlertDialog Builder, а не в AlertDialog.
Попробуйте следующий код:
public class Xyz extends Activity { public void onCreate(...) { // some listener will trigger initSearch() } private void initSearch() { AlertDialog.Builder searchDialog = new AlertDialog.Builder(this); LayoutInflater inflater = this.getLayoutInflater(); searchDialog.setTitle("Search Photos"); searchDialog.setMessage("Specify tag and value..."); // R.layout.search_dialog is my custom layour, it displays fine, it works. searchDialog.setView(inflater.inflate(R.layout.search_dialog, null)); EditText tagText = (EdiText) findViewById(R.id.tagField); // WILL RETURN NULL searchDialog.setPositiveButton( ... ) ... AlertDialog myAlert = searchDialog.create(); //returns an AlertDialog from a Builder. myAlert.show(); }
У меня была такая же проблема при программировании многоязычного приложения. В конце концов я узнал, что забыл обновлять метки в файлах активности [xml] в макете.
У меня было 3 из них:
.xml .xml(land) .xml(iw)
Я обновил только первый и забыл обновить другое следующим образом:
У всех трех был один TextView с идентификатором:
Затем я изменил имя идентификатора этого текстового представления – только в первом файле – на:
И, конечно же, в Java-коде Activity (который использует все три …):
TextView tv = findViewByID(R.id.status_textbox);
Это сработало для обычной (английской
) версии.
Но когда я перешел на IW-язык (иврит
), tv
получил нулевое значение, и я даже получил некоторые раздатки.
Когда я изменил идентификатор текстового вида других файлов на "@+id/status_textbox"
все работало как шарм …
Поэтому просто убедитесь, что все ваши идентификаторы обновлены и учтены во всех ваших макетах и языках.
Это все равно решило мою проблему.