14

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

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

这工作正常。它在 中显示布局Dialog,但是,子项始终返回为 null findViewById(R.id.some_search_layout_children)

我已经尝试多次清理我的项目,尝试为 my 实现另一个类DialogfindViewById()作为我的 main 的成员Activity,在方法内部和for theinitSearch()的匿名实现内部,但结果都相同。我还尝试将孩子们分成独立的 s 并以编程方式调用它们:OnClickListenerDialogView

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
}
4

4 回答 4

46

调用将在您的活动布局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命名的dialogView. 然后,为了找到你的EditText名字tagField,我正在使用dialogView.findViewById(R.id.tagField);

于 2013-04-24T13:23:59.737 回答
2

TextViewwith idtext123必须在Layout你设置的里面声明setContentView

于 2013-04-24T12:47:13.803 回答
0

你的问题是你试图.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();
}
于 2013-04-24T12:52:41.180 回答
0

我在编写多语言应用程序时遇到了完全相同的问题。最终我发现我忘记更新某些布局的活动 [xml] 文件中的标签。

每个活动我有 3 个:

<activity_name>.xml
<activity_name>.xml(land)
<activity_name>.xml(iw)

我只更新了第一个而忘记更新另一个如下:

这三个都有一个 TextView,其 id 为:

    <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,我得到了 null 值,我什至有些迷恋。

当我将其他文件的文本视图 ID 更改为"@+id/status_textbox"一切都像一个魅力......

因此,只需确保您的所有 ID 都已更新并在您的所有布局和语言中得到说明。

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

于 2016-11-30T08:52:34.380 回答