findViewById() returns null – tried EVERYTHING

I give up… not even my professor knows why this is happening.

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

  • How to detect running app using ADB command
  • Android Fatal signal 11 (SIGSEGV) at 0x636f7d89 (code=1). How can it be tracked down?
  • Disable Click Event on Android ListView Items
  • Tiling a Bitmap on a Canvas
  • ImageView fills parent's width OR height, but maintains aspect ratio
  • AlertDialog's setCancelable(false) method not working
  • LAYOUT: search_layout. 2 EdiText and 2 TextView children.

    RUNTIME: setView(inflater.inflate(R.layout.search_layout, null)) // works fine, it displays the layout inside the dialog, yet, children are always returned as null by findViewById(R.id.some_search_layout_children)
    

    EXCEPTION: Parsing exception of the XML, as resource not found, hence null.

    TRIED: Cleaned my project around 1024 times, tried to implement another class for my dialog box, same result, called findViewById as a member of my main activity, inside the method initSearch() and inside an anonymous implementation of OnClickListener for my dialog, SAME RESULT. Broke the children into independent views and programmatically called them:

    TextView text = (TextView) findResourceById(R.id.new_independant_textview); // same result
    

    I think I tried everything.

    This is my Code:

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

    Now, when I do:

     EditText text = (EditText) findViewById(R.id.tagField); // returns null, ALWAYS
     // no matter HOW, WHERE, global, local final, etc, it just returns null.
    

    Here is the XML of my custom 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>
    

    This is my R.java file:

    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
    }
    

    Thanks for your help, happy hunting.

  • Android webview slow
  • Creating a Fragment: constructor vs newInstance()
  • Eclipse startup hang, “Android SDK: resolving error markers”
  • Android multiple email attachments using Intent
  • Android Save Image Exif Information goes Wrong in Marshmallow 6.0.1
  • Error When building a large Codename One Application During the Dex Phase
  • 4 Solutions collect form web for “findViewById() returns null – tried EVERYTHING”

    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.

    Try this

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

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

    The TextView with id text123 has to be declared inside the Layout you set with setContentView

    Your problem is you are trying to do .show() on a AlertDialog Builder, not the AlertDialog itself.

    Try the following code:

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

    I had the exact same problem while programming a multilingual app.
    Eventually I found out that I forgot to update labels in some layout’s activity [xml] files.

    I had 3 of them per activity:

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

    I updated only the first and forgot to update the other as follows:

    All three had the a single TextView with the id of:

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

    Then I’ve changed the name of the id of that text view – only in the first file – to:

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

    And, of-course, in the Activity’s Java code (that uses all three…):

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

    This worked for the regular (English <activity_name>.xml) version.

    But when I went the the IW language (Hebrew <activity_name>xml(iw)) tv got null value and I even got some crushes.

    When I changed the text view id of the other files to "@+id/status_textbox" everything worked like a charm…

    So, simply make sure all your IDs are updated and accounted for in all your layouts and languages.

    This solved my problem anyway..

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.