findViewById() 为对话框中的视图返回 null [英] findViewById() returns null for Views in a Dialog

查看:20
本文介绍了findViewById() 为对话框中的视图返回 null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题是,无论我在何处或如何调用此布局的组件,它们始终返回 null.

The problem is, no matter where or how I call for this layout's components, they always return null.

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

这很好用.它在 Dialog 中显示布局,但是,findViewById(R.id.some_search_layout_children) 总是将子项返回为 null.

This works fine. It displays the layout inside the Dialog, yet, the children are always returned as null by findViewById(R.id.some_search_layout_children).

我多次尝试清理我的项目,尝试为我的 Dialog 实现另一个类,称为 findViewById() 作为我的主要 Activity 的成员,在 initSearch() 方法内,以及 DialogOnClickListener 匿名实现内,但都具有相同的结果.我还尝试将孩子分成独立的 View 并以编程方式调用它们:

I've tried cleaning my project multiple times, tried to implement another class for my Dialog, called findViewById() as a member of my main Activity, inside the initSearch() method, and inside an anonymous implementation of OnClickListener for the Dialog, but all with the same result. I've also tried breaking the children out into independent Views and programmatically calling them:

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.

always returns null, no matter how or where it's called – globally, local final, etc. – it just returns null.

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

Here is the XML of my custom Dialog layout:

<?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 上调用 findViewById().

Calling findViewById() will search for views within your Activity's layout and not your dialog's view. You need to call findViewById() on the specific View that you set as your dialog's layout.

试试这个

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();
}

注意我如何扩充视图并将其存储在名为 dialogViewView 中.然后,为了找到名为 tagFieldEditText,我使用了 dialogView.findViewById(R.id.tagField);

Notice how I'm inflating the view and storing it in a View named dialogView. Then, to find your EditText named tagField, I'm using dialogView.findViewById(R.id.tagField);

这篇关于findViewById() 为对话框中的视图返回 null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆