findViewById () devuelve null cuando lo llamo onCreate ()

Tengo un problema con findViewById en mi primera aplicación de Android. Intento llamar a esta función pero siempre devuelvo nulo.

Mi aplicación tiene 2 actividades. En la segunda actividad (activity_display_message) tengo este código:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()) .commit(); } //Obtener el mensaje desde el intent en MainActivity Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); //Buscar el textview en la vista TextView textView = (TextView) findViewById(R.id.texto); textView.setText(message); } 

Y este es el fragment_display_message.xml

   

No sé por qué devuelve NULL y genera una NullPointerException cuando bash hacer un setText() . Estoy llamando al Id. Correcto y también lo declaro en el XML. Y estoy llamando a setContextView() en onCreate() .

Lo siento si esta pregunta es demasiado obvia (creo que estoy ignorando algo obvio), pero soy nuevo en el desarrollo de Android.

EDITAR: error de Logcat:

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

Editar:

Problema resuelto. Solo necesita mover el código de onCreate() a onCreateView() y editar las referencias.

onCreate() será el predeterminado.

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()) .commit(); } } 

Y el onCreateView() en PlaceholderFragment :

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_display_message, container, false); //Obtener el mensaje desde el intent en MainActivity Intent intent = getActivity().getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); //Buscar el textview en la vista TextView textView = (TextView) rootView.findViewById(R.id.texto); textView.setText(message); return rootView; } 

Activity findViewById() busca en la jerarquía de vistas de la actividad establecida con setContentView() para la ID de vista dada. La vista que parece estar buscando está en un fragmento y no en la jerarquía de actividad (todavía). Las transacciones de fragmentos tampoco son inmediatas, por lo que incluso si lo agrega al contenedor en la jerarquía de actividades, no se adjunta de inmediato, sino solo cuando se procesa la transacción.

En teoría, es posible ejecutar de forma síncrona las transacciones de fragmentos pendientes con executePendingTransactions() . Sin embargo, es mejor mover el código que toca las vistas de un fragmento en su onCreateView() . Se supone que los fragmentos y sus actividades de hospedaje son relativamente independientes entre sí, por lo que se debe evitar una actividad que acceda a las partes internas de un fragmento.

estás buscando texto en el lugar equivocado. El diseño de su actividad es activity_display_message pero el texto pertenece a fragment_display_message.xml

Estoy de acuerdo con Blackbelt. Estás buscando en el lugar equivocado. Además, le sugiero que agregue el id al diseño con el "@+id/" , de esta forma sabrá exactamente dónde se encuentra en la jerarquía.