NullPointerException: nom == null
Je voudrais développer une application Android qui utilise des Fragments. J'ai eu cette erreur.
Caused by: java.lang.NullPointerException: name == null
Ce n' name == null
veux dire? Voici le log complet
08-04 15:02:22.422: E/AndroidRuntime(2499): FATAL EXCEPTION: main
08-04 15:02:22.422: E/AndroidRuntime(2499): java.lang.RuntimeException: Unable to start activity ComponentInfo{fi.peltoset.mikko.home/fi.peltoset.mikko.home.Koti}: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.os.Looper.loop(Looper.java:137)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.reflect.Method.invokeNative(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.reflect.Method.invoke(Method.java:511)
08-04 15:02:22.422: E/AndroidRuntime(2499): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-04 15:02:22.422: E/AndroidRuntime(2499): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-04 15:02:22.422: E/AndroidRuntime(2499): at dalvik.system.NativeStart.main(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499): Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
08-04 15:02:22.422: E/AndroidRuntime(2499): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Activity.setContentView(Activity.java:1867)
08-04 15:02:22.422: E/AndroidRuntime(2499): at fi.peltoset.mikko.home.Koti.onCreate(Koti.java:13)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Activity.performCreate(Activity.java:5008)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-04 15:02:22.422: E/AndroidRuntime(2499): ... 11 more
08-04 15:02:22.422: E/AndroidRuntime(2499): Caused by: java.lang.NullPointerException: name == null
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.VMClassLoader.findLoadedClass(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:354)
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.ClassLoader.loadClass(ClassLoader.java:491)
08-04 15:02:22.422: E/AndroidRuntime(2499): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Fragment.instantiate(Fragment.java:574)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Fragment.instantiate(Fragment.java:552)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.app.Activity.onCreateView(Activity.java:4656)
08-04 15:02:22.422: E/AndroidRuntime(2499): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
08-04 15:02:22.422: E/AndroidRuntime(2499): ... 21 more
C'est dans une classe appelée Navigation
. Il s'étend android.app.Fragment
.
Dans onCreateView
méthode que j'gonfler la mise en page et de le retourner. Dans le onActivityCreated
méthode-je vérifier si la mise en page se compose de deux volets (j'ai des mises en page différentes pour les différents périphériques) et sur cette base je ajouter onClickListeners.
Mon code ressemble à ceci.
public class Navigation extends Fragment {
private OnItemSelectedListener listener;
private boolean dualPane = false;
public interface OnItemSelectedListener {
public void onMenuItemSelected(int fragmentId);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
if(activity instanceof OnItemSelectedListener) {
this.listener = (OnItemSelectedListener) activity;
} else {
...
}
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_navigation, container, false);
return view;
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View contentPane = getActivity().findViewById(R.id.contentFragment);
dualPane = contentPane != null && contentPane.getVisibility() == View.VISIBLE;
if(dualPane) {
final ListView menu = (ListView) getActivity().findViewById(R.id.valikko);
menu.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
String[] texts = new String[] {
...
};
ArrayList<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("Home", R.drawable.koti2));
...
ImageArrayAdapter adapter = new ImageArrayAdapter(getActivity(), items, texts);
menu.setAdapter(adapter);
menu.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = ((TextView) view.findViewById(R.id.label)).getText().toString();
listener.onMenuItemSelected(0); //TODO ...
}
});
} else {
ImageView btnYleiskatsaus = (ImageView) getActivity().findViewById(R.id.btnYleiskatsaus);
...
btnYleiskatsaus.setOnClickListener(onMenuClikkedListener);
...
}
}
private OnClickListener onMenuClikkedListener = new OnClickListener() {
@Override
public void onClick(View v) {
...
}
};
}
Le fichier de mise en page layout-sw720dp-land/activity_navigation.xml
regarde ce
<LinearLayout
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:background="@color/pressed_koti"
android:orientation="vertical" >
<ListView
android:id="@+id/valikko"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</ListView>
</LinearLayout>
Ici est la activity_koti.xml
fichier.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<fragment
android:id="@+id/menuFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
class="fi.peltoset.mikko.home.Navigation" />
<fragment
android:id="@+id/contentFragment"
android:layout_width="fill_parent"
android:layout_height="match_parent" />
</LinearLayout>
J'ai couru à la demande sur un émulateur avec Android 4.1.2.
Quelles sont les causes de ces erreurs et comment les corriger?
Ce qui est en
fi.peltoset.mikko.home.Koti.onCreate(Koti.java:13)
il apparaît que ce est là que votre code est à l'origine de la trace de la pileC'est l'écran applications de l'Activité de la méthode onCreate et sur cette ligne, il y a
setContentView(R.layout.activity_koti);
Montrer que le fichier xml puis, pas l'autre.
Vous devez vérifier que quel que soit le fichier XML R. la mise en page est stockée que activity_koti est correctement définie. Si c'est le cas, vérifiez le acitivity_koti.xml pour les erreurs.
OriginalL'auteur MikkoP | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
android:name
au point de vos fragments au lieu declass
, il est également nécessaire d'inclure le même attribut pour votre deuxième fragment, ce qui expliquerait lename==null
.Edit: Apparemment classe peuvent être interchangeables avec android:name, mais je tiens à ce que les docs utilisation.
Il devrait être;
http://developer.android.com/training/basics/fragments/creating.html#AddInLayout
android:name
(ou la classe) attribut sur le deuxième fragment d'élément de trop. Cet Élément contient remplaçables à chaud de contenu, donc je l'ai laissé sans elle. Grâce à ce post j'ai remplacé le deuxième fragment avec un LinearLayout et insérée par programmation la mise en page.OriginalL'auteur Robadob
Lorsque vous ajoutez un fragment dans le fichier XML, vous devez lui donner un
name
attribut. C'est pourquoi il est dit "name = null,", parce que vous ne faites pas cela.Voir le guide pour l'ajout de Fragments pour plus d'.
OriginalL'auteur Geobits
Essayez d'ajouter un
class
à votre deuxième fragment dansactivity_koti.xml
si vous faites référence dans votreFragmentActivity
.Ou, comme Robadob dit, ajouter
android:name:"your.path.YourName"
à la fois.Intéressant plus d'infos sur
class
vsandroid:name
en XML références àFragment
s ici.Les deux (1, 2) guide android pages sur des fragments de ne pas parler de la
class
attribut, ils utilisentandroid:name
pour la fonction. Sur la vérification de la docs page, qui utiliseclass
et pasandroid:name
.oui, et cela fonctionne, je le promets 🙂 j'ai développé des fragments à l'aide de
class
dans le xml. N'était pas trop sûr qu'il pourrait appliquer parce qu'ils ont le soutien des fragments, mais il ne semble pas être pertinente. Voir mon edit pour un lien à la question surclass
vsandroid:name
.J'ai déjà le même lien dans ma réponse, le lire ensuite.
oups - j'ai lu votre commentaire et a réagi avant de lire votre réponse encore une fois.
OriginalL'auteur Mena