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>
You are giving
setContentView()
the wrong layout if your XML is actually declared asfragment_main
. That is why the controls are currentlynull
.The TextView textView1 you are trying to refer is in the Fragment's inflated layout. The content view you have set in the Activity is activity_main.xml, which probably doesn't have the textView1 component.
The solution is to override the Fragment's onViewCreated() method and set the text there
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 enclosing 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.
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: