textView setText() NullPointerException

11,389

Solution 1

Can you post xml? It's likely that the id your java is assuming "R.id.textView1" is wrong. Maybe R.id.textview1?

Well if your text view lives inside the fragment just do this:

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            TextView tv = (TextView) rootView.findViewById(R.id.textView1);
        tv.setText("Teststring");
            return rootView;
        }

Solution 2

You are giving setContentView() the wrong layout if your XML is actually declared as fragment_main. That is why the controls are currently null.

// The layout file is not correct.
setContentView(R.layout.activity_second);
Share:
11,389
David Hunsicker
Author by

David Hunsicker

I write code. Sometimes it even works.

Updated on September 14, 2022

Comments

  • David Hunsicker
    David Hunsicker over 1 year

    I have an almost completely Vanilla App. All I'm trying to do is change the text of a textView, but it gives me a NullPointerException. I have no XML configuration, no added methods, nothing special. I checked my class, and it's pointing to the correct XML, and the XML does have a textView element in it with the correct id.

    I have also tried creating the textView instance outside of onCreate() on the class level, and the app just fails to start no matter what. I'm sure I'm overlooking simple, but I can't find the answer. Thanks for the help. EDIT: I realize that I need to move this code so that it accesses fragment resources, but when I do, it gives me an error:

    Cannot make a static reference to the non-static method findViewById(int) from the type Activity

    Where should I put my code if ALL of my views are in my fragment, and not in my Activity XML? or should I just have the activity load the fragment to begin with? package com.example.testapp;

    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.app.ActionBar;
    import android.support.v4.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.os.Build;
    
    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView tv = (TextView) findViewById(R.id.textView1);
            tv.setText("Teststring");
    
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new PlaceholderFragment()).commit();
        }
    
    
        }
    
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    
    
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
    
    
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
    
        public static class PlaceholderFragment extends Fragment {
    
            public PlaceholderFragment() {
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container,
                        false);
                return rootView;
            }
    
        }
    
    
    }
    

    ERROR LOG:

    06-14 17:02:27.405: E/AndroidRuntime(1420): FATAL EXCEPTION: main
    06-14 17:02:27.405: E/AndroidRuntime(1420): Process: com.example.testapp, PID: 1420
    06-14 17:02:27.405: E/AndroidRuntime(1420): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testapp/com.example.testapp.MainActivity}: java.lang.NullPointerException
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.os.Handler.dispatchMessage(Handler.java:102)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.os.Looper.loop(Looper.java:136)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.main(ActivityThread.java:5017)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at java.lang.reflect.Method.invoke(Method.java:515)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at dalvik.system.NativeStart.main(Native Method)
    06-14 17:02:27.405: E/AndroidRuntime(1420): Caused by: java.lang.NullPointerException
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at com.example.testapp.MainActivity.onCreate(MainActivity.java:23)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.Activity.performCreate(Activity.java:5231)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    06-14 17:02:27.405: E/AndroidRuntime(1420):     ... 11 more
    

    XML fragment_main

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.testapp.MainActivity$PlaceholderFragment" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
    </RelativeLayout>
    
  • David Hunsicker
    David Hunsicker almost 10 years
    like I said, I already checked the XML, and the id is fine. I think it has to do with me trying to access an id that's on the fragment, in the onCreate(). I saw in another post that one has to add the code editing the view in the fragment onCreateView(); but when I do that, i get an error: Cannot make a static reference to the non-static method findViewById(int) from the type Activity
  • David Hunsicker
    David Hunsicker almost 10 years
    I'm using the main_activity XML, and then the fragment_main is loaded. fragment_main is where the views are that I want to manipulate
  • David Hunsicker
    David Hunsicker almost 10 years
    do you mean the fragment's onCreateView()?
  • rhoadster91
    rhoadster91 almost 10 years
    no, there is another method called onViewCreated which is called AFTER onCreateView. At this point, the view is inflated and added to the root view. The View view parameter supplies the inflated view. Your text view can be found in this view.
  • rhoadster91
    rhoadster91 almost 10 years
    Remember to call view.findViewById(R.id.textView1) and not just findViewById(R.id.textView1) because in the latter, you are trying to access the parent class non-static method in a static inner class. By calling view.findViewById(R.id.textView1) you are calling a method of a local variable in the static inner class.
  • David Hunsicker
    David Hunsicker almost 10 years
    TextView tv = (TextView) rootView.findViewById(R.id.textView1); "rootView." this was my problem, why do I need this?
  • rhoadster91
    rhoadster91 almost 10 years
    That is because you were trying to refer to a non-static method of the parent class in the static inner class. I have mentioned this in my answer below.
  • Ryhan
    Ryhan almost 10 years
    the inflate() method returns a reference to the top-most view in the fragment_main xml hierarchy in this case your relativelayout so you can cast it to that also... and from there you just find the textview that lives in the relative layout
  • mike-gallego
    mike-gallego about 6 years
    @DavidHunsicker thanks for pointing that out. I figured out why my app was crashing fromt that.