tutorial studio navegar implement how fragments example entre ejemplo dinamicos android android-fragments fragment

studio - android.content.Context.getPackageName() ''en una referencia de objeto nulo



navegar entre fragments android studio (9)

API de Android nivel 23.

Utilizar

getContext ()

en lugar de

getActivity ()

getActivity () le da a la actividad principal, un objeto de contexto

Aquí puedes usar

MyActivity.this

en lugar de

getActivity () / getApplicationContext ()

Hola, estoy trabajando con Fragments que implementa una interfaz.

public class SigninFragment extends Fragment implements SigninInterface

La implementación del método de la interfaz en la clase de fragmento es la siguiente.

@Override public void afterSubmitClicked(String userId, Bundle bundle) { Log.d(TAG,"Calling time afterSubmitClicked called"+bundle); if(!userId.equals("-1")){ //Logged in successfully //Move to MusicHome Intent mIntent = new Intent(getActivity(),MusicHome.class); mIntent.putExtra("SigninFragment.user_details", bundle); startActivity(mIntent); }else{ //Logging in failed //show error dialog } }

Se llama a este método después de ejecutar una clase AsynchronousTask (que extiende AsyncTask).

Pero me estoy cayendo. Y el mensaje de error muestra

java.lang.NullPointerException: Attempt to invoke virtual method ''java.lang.String android.content.Context.getPackageName()'' on a null object reference

Logcat

02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.android, PID: 28177 02-14 16:37:04.648: E/AndroidRuntime(28177): java.lang.NullPointerException: Attempt to invoke virtual method ''java.lang.String android.content.Context.getPackageName()'' on a null object reference 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.content.ComponentName.<init>(ComponentName.java:77) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.content.Intent.<init>(Intent.java:3996) 02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.java:152) 02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:92) 02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:1) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask.finish(AsyncTask.java:632) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask.access$600(AsyncTask.java:177) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.Handler.dispatchMessage(Handler.java:102) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.Looper.loop(Looper.java:135) 02-14 16:37:04.648: E/AndroidRuntime(28177): at android.app.ActivityThread.main(ActivityThread.java:5221) 02-14 16:37:04.648: E/AndroidRuntime(28177): at java.lang.reflect.Method.invoke(Native Method) 02-14 16:37:04.648: E/AndroidRuntime(28177): at java.lang.reflect.Method.invoke(Method.java:372) 02-14 16:37:04.648: E/AndroidRuntime(28177): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 02-14 16:37:04.648: E/AndroidRuntime(28177): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Lo intenté y exploré en Google. Pero no obtuve ninguna solución. ¿Alguien podría ayudar en esto?


En mi caso, el error ocurrió dentro de un Fragment en esta línea:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);

Sucedió cuando hice doble clic en un elemento que activó el código anterior, por lo que se lanzaron dos actividades SecondaryActivity.class al mismo tiempo, una encima de la otra. Cerré la actividad superior de SecondaryActivity.class presionando el botón Atrás que activó una llamada a getActivity() en SecondaryActivity.class que pasó a primer plano. La llamada a getActivity() devuelve null . Es una especie de error extraño de Android, por lo que generalmente no debería suceder. Puede bloquear los clics después de que el usuario hizo clic una vez.


He encontrado el error de lo que hice. Necesitamos obtener la instancia de actividad del método de anulación OnAttach () Por ejemplo,

public MainActivity activity; @Override public void onAttach(Activity activity){ this.activity = activity; }

Luego pase la actividad como contexto de la siguiente manera.

Intent mIntent = new Intent(activity, MusicHome.class);


Las respuestas a esta pregunta me ayudaron a encontrar mi problema, pero mi fuente era diferente, así que espero que esto pueda arrojar luz sobre alguien que encuentre esta página buscando respuestas al colapso del contexto ''aleatorio'':

Había especificado un objeto SharedPreferences e intenté instanciarlo en su declaración de nivel de clase, así:

public class MyFragment extends FragmentActivity { private SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //...

Hacer referencia a this antes de onCreate me causó el error "java.lang.NullPointerException: intento de invocar el método virtual ''java.lang.String android.content.Context.getPackageName ()'' en una referencia de objeto nulo" .

Instanciar el objeto dentro de onCreate () resolvió mi problema, así:

public class MyFragment extends FragmentActivity { private SharedPreferences sharedPref ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

Espero que ayude.


Mi clase no se extiende a Activiti. Resolví el problema de esta manera.

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();


Para mí, el problema era que estaba pasando Actividad al constructor, no Contexto

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

y usando esta actividad para obtenerDeDefaultSharedPreferences (), así que cambié la Actividad a Contexto y todavía estaba llamando al constructor del Adaptador con MainActivity.


Resuelve el problema con un intento / captura. Este bloqueo ocurre cuando el usuario cierra la aplicación antes de la intención de inicio.

try { Intent mIntent = new Intent(getActivity(),MusicHome.class); mIntent.putExtra("SigninFragment.user_details", bundle); startActivity(mIntent); } catch (Exception e) { e.printStackTrace(); }


Solo necesitas hacer esto:

public Adapter(Activity activity, List<MediaItem> items, boolean can) { mItems = items; canEdit = can; mActivity = activity; }


Tuve el mismo problema al intentar mostrar una tostada en un fragmento.

Después de algunas depuraciones descubrí que estaba eliminando el fragmento antes de llamar:

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter { ... holder.title.setOnClickListener({v-> v.context.startActivity(Intent(context, HomeActivity::class.java)) }) ... }

Debido a que el fragmento había sido eliminado , el contexto se volvió nulo, causando la excepción.

Solución simple: llame a getContext() antes de eliminar el fragmento.