android - findViewById() 对于对话框中的 View 返回 null

标签 android nullpointerexception android-resources android-dialog findviewbyid

问题是,无论我在哪里或如何调用此布局的组件,它们总是返回 null。

setView(inflater.inflate(R.layout.search_layout, null))

这很好用。它显示 Dialog 内的布局,但是 findViewById(R.id.some_search_layout_children) 始终将子项返回为 null。

我多次尝试清理我的项目,尝试为我的 Dialog 实现另一个类,称为 findViewById() 作为我的主 Activity 的成员initSearch() 方法内以及 DialogOnClickListener 匿名实现内,但结果均相同。我还尝试将子级分解为独立的 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();
    }

这一行:

 EditText text = (EditText) findViewById(R.id.tagField);

始终返回 null,无论如何或在何处调用 - 全局、本地 final 等 - 它只是返回 null。

这是我的自定义 Dialog 布局的 XML:

<?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 文件:

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
}

最佳答案

调用findViewById()将搜索 Activity 布局中的 View ,而不是对话框的 View 。您需要在设置为对话框布局的特定View 上调用findViewById()

试试这个

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 并将其存储在名为 dialogViewView 中。然后,为了找到名为 tagFieldEditText,我使用 dialogView.findViewById(R.id.tagField);

关于android - findViewById() 对于对话框中的 View 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59077056/

相关文章:

java - Android中的简单图像识别任务 : Dominoes Reading

Android Canvas.drawCircle() 是它应该大小的一半

Android:为视频解码器创建 OMX 组件

android - 在 Android 5.0 中使用 AppCompat 的 SearchView 出现 NullPointerException

java - 随机资源选择

android - 有没有办法在 strings.xml 中有一个带空格的资源名称?

android - 即使使用最新的构建工具,任务 ':app:processDebugResources' 的执行也失败

android - android中动态添加textView到gridView

android - 在具有多 SIM 卡的设备中检索 ConnectivityManager 时出现问题

android - 在 customView 的 TypedArray 上获取 getString 的空指针异常