web-dev-qa-db-ja.com

findViewById()は、ダイアログ内のビューに対してnullを返します

問題は、このレイアウトのコンポーネントをどこでどのように呼び出しても、常にnullを返すことです。

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

これは正常に機能します。 Dialog内のレイアウトが表示されますが、子は常にfindViewById(R.id.some_search_layout_children)によってnullとして返されます。

プロジェクトを何度もクリーンアップし、メインのDialogのメンバーとしてfindViewById()と呼ばれる、Activityの別のクラスを、initSearch()メソッド内、およびの匿名実装内に実装しようとしました。 OnClickListenerDialogですが、結果はすべて同じです。また、子を独立したViewsに分割し、プログラムでそれらを呼び出すことも試みました。

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

グローバル、ローカルfinalなど、呼び出される方法や場所に関係なく、常にnullを返します。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
}
12
Fer

findViewById()を呼び出すと、アクティビティレイアウト内のビューが検索され、notダイアログのビューが検索されます。ダイアログのレイアウトとして設定した特定のViewfindViewById()を呼び出す必要があります。

これを試して

_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);を使用しています。

41
dymmeh

IDがtext123TextViewは、Layoutで設定したsetContentView内で宣言する必要があります。

2
Blackbelt

問題は、AlertDialog自体ではなく、AlertDialogBu​​ilderで.show()を実行しようとしていることです。

次のコードを試してください。

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

多言語アプリのプログラミング中に、まったく同じ問題が発生しました。最終的に、一部のレイアウトのアクティビティ[xml]ファイルのラベルを更新するのを忘れていることがわかりました。

アクティビティごとに3つありました。

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

私は最初のものだけを更新し、次のように他のものを更新するのを忘れました:

3つすべてに、IDが次の単一のTextViewがありました。

_    <TextView
    Android:id="@+id/loading_textbox"
    .../>
_

次に、そのテキストビューのIDの名前を(最初のファイルでのみ)次のように変更しました。

_    <TextView
    Android:id="@+id/status_textbox"
    .../>
_

そしてもちろん、アクティビティのJavaコード(3つすべてを使用します...)):

_    TextView tv = findViewByID(R.id.status_textbox);
_

これは通常の(英語_<activity_name>.xml_)バージョンで機能しました。

しかし、私がIW言語に行ったとき(ヘブライ語<activity_name>xml(iw)tvはnull値を取得し、いくつかのときめきさえも取得しました。

他のファイルのテキストビューIDを_"@+id/status_textbox"_に変更すると、すべてが魅力のように機能しました...

したがって、すべてのIDが更新され、すべてのレイアウトと言語で考慮されていることを確認してください。

これはとにかく私の問題を解決しました。

0
JamesC