findViewById()为对话框中的视图返回null

时间:2013-04-24 12:45:13

标签: android nullpointerexception android-resources android-dialog findviewbyid

问题是,无论我在何处或如何调用此布局的组件,它们始终返回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

4 个答案:

答案 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都在您的所有布局和语言中进行更新和计算。

无论如何这解决了我的问题..