问题是,无论我在何处或如何调用此布局的组件,它们始终返回null。
setView(inflater.inflate(R.layout.search_layout, null))
这很好用。它显示Dialog
内的布局,但是,findViewById(R.id.some_search_layout_children)
始终将子项返回为空。
我已多次尝试清理我的项目,尝试在Dialog
内为我的findViewById()
实施另一个类Activity
作为我的主initSearch()
成员方法,并在OnClickListener
的{{1}}的匿名实现中,但都具有相同的结果。我还尝试将孩子们分成独立的Dialog
并以编程方式调用它们:
View
但是,同样的结果。
这是相关代码:
TextView text = (TextView) findResourceById(R.id.new_independant_textview);
这一行:
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();
}
总是返回null,无论它在何处或何处被调用 - 全局,本地 EditText text = (EditText) findViewById(R.id.tagField);
等 - 它只返回null。
以下是我的自定义final
布局的XML:
Dialog
这是我的<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/search_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tagText"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="@string/tag" />
<EditText
android:id="@+id/tagField"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
<TextView
android:id="@+id/valueText"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="@string/value" />
<EditText
android:id="@+id/valueField"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
</LinearLayout>
文件:
R.java
答案 0 :(得分:39)
致电findViewById()
将在活动布局中搜索视图,并在 对话框视图中搜索。您需要在您设置为对话框布局的特定findViewById()
上调用View
。
试试这个
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
的{{1}}中。然后,要找到名为dialogView
的{{1}},我正在使用EditText
答案 1 :(得分:2)
TextView
的{{1}}必须在您使用text123
设置的Layout
内声明
答案 2 :(得分:0)
您的问题是您在AlertDialog Builder上尝试.show()
,而不是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();
}
答案 3 :(得分:0)
编程多语言应用时,我遇到了完全相同的问题。 最后我发现我忘了在某些布局的活动[xml]文件中更新标签。
每项活动我有3个:
<activity_name>.xml
<activity_name>.xml(land)
<activity_name>.xml(iw)
我只更新了第一个,忘了更新另一个,如下所示:
这三个人都有一个ID为:
的TextView <TextView
android:id="@+id/loading_textbox"
.../>
然后我将该文本视图的ID名称 - 仅在第一个文件中 - 更改为:
<TextView
android:id="@+id/status_textbox"
.../>
当然,在Activity的Java代码中(使用全部三个......):
TextView tv = findViewByID(R.id.status_textbox);
这适用于常规(英语<activity_name>.xml
)版本。
但是当我使用IW语言(希伯来语<activity_name>xml(iw)
)tv
得到空值时,我甚至得到了一些粉碎。
当我将其他文件的文本视图ID更改为"@+id/status_textbox"
时,一切都像魅力一样......
因此,只需确保所有ID都在您的所有布局和语言中进行更新和计算。
无论如何这解决了我的问题..