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.