J'ai créé une page de paramètres de compte qui intègre plusieurs options qui s'ouvrent via des fragments. Cependant, je semble être confronté à un problème que je ne peux pas résoudre. J'ai essayé plusieurs solutions mais je semble avoir des erreurs. Votre aide est appréciée!
Lorsque vous cliquez sur le bouton pour ouvrir AccountSettingsActivity, l'application se bloque. Erreur incluse ci-dessous.
Voici mon code:
AccountSettingsActivity.java
E / AndroidRuntime: FATAL EXCEPTION: main Process: com.archive.pod, PID: 22146 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.archive.pod.Profile.AccountSettingsAdapter.getView(AccountSettingsAdapter.java: 78) at android.widget.AbsListView.obtainView(AbsListView.java: 2405) at android.widget.ListView.makeAndAddView(ListView.java: 2071) at android.widget.ListView.fillDown(ListView.java: 797) at android.widget.ListView.fillFromTop(ListView.java: 859) at android.widget.ListView.layoutChildren(ListView.java: 1842) at android.widget.AbsListView.onLayout(AbsListView.java: 2202) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.RelativeLayout.onLayout(RelativeLayout.java: 1103) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.RelativeLayout.onLayout(RelativeLayout.java: 1103) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java: 1183) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java: 870) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java: 889) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.FrameLayout.layoutChildren(FrameLayout.java: 332) at android.widget.FrameLayout.onLayout(FrameLayout.java: 270) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.LinearLayout.setChildFrame(LinearLayout.java: 1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java: 1673) at android.widget.LinearLayout.onLayout(LinearLayout.java: 1582) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.FrameLayout.layoutChildren(FrameLayout.java: 332) at android.widget.FrameLayout.onLayout(FrameLayout.java: 270) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.LinearLayout.setChildFrame(LinearLayout.java: 1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java: 1673) at android.widget.LinearLayout.onLayout(LinearLayout.java: 1582) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.widget.FrameLayout.layoutChildren(FrameLayout.java: 332) at android.widget.FrameLayout.onLayout(FrameLayout.java: 270) at com.android.internal.policy.DecorView.onLayout(DecorView.java: 779) at android.view.View.layout(View.java: 22466) at android.view.ViewGroup.layout(ViewGroup.java: 6304) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java: 3157) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java: 2614) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java: 1745) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java: 7768) at android.view.Choreographer$CallbackRecord.run(Choreographer.java: 967) at android.view.Choreographer.doCallbacks(Choreographer.java: 791) at android.view.Choreographer.doFrame(Choreographer.java: 726) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java: 952) at android.os.Handler.handleCallback(Handler.java: 883) at android.os.Handler.dispatchMessage(Handler.java: 100) at android.os.Looper.loop(Looper.java: 214) at android.app.ActivityThread.main(ActivityThread.java: 7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java: 492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 930)
AccountSettingsAdapter.java
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/layout_center_viewpager"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relLayout1"> <!-- *************** Top Section ***************** --> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/relLayout2"> <include layout="@layout/snippet_top_accountsettingtoolbar"/> </RelativeLayout> <!-- *************** Middle Section ***************** --> <RelativeLayout android:id="@+id/relLayout3" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/relLayout2" android:padding="30dp" android:background="@color/windowBackground"> <ListView android:id="@+id/lvAccountSettings" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@null" android:dividerHeight="0dp"> </ListView> </RelativeLayout> </RelativeLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
AccountSettingsOptions.java
public class AccountSettingsOptions { private String name; private String description; public AccountSettingsOptions(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
activity_accountsettings.xml
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.archive.pod.R; import java.util.ArrayList; public class AccountSettingsAdapter extends BaseAdapter { ArrayList < Object > list; private static final int OPTIONS = 0; private static final int HEADER = 1; private LayoutInflater inflater; public AccountSettingsAdapter(Context context, ArrayList < Object > list) { this.list = list; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getItemViewType(int position) { if (list.get(position) instanceof AccountSettingsOptions) { return OPTIONS; } else { return HEADER; } } @Override public int getViewTypeCount() { return 2; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } /** This distinguishes between section title and list view options, then using switch it beings to populate the options in the list view with titles and descriptions */ @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { switch (getItemViewType(i)) { case OPTIONS: view = inflater.inflate(R.layout.activity_accountsettings, viewGroup, false); break; case HEADER: view = inflater.inflate(R.layout.listview_section_header_accountsettings, viewGroup, false); break; } } switch (getItemViewType(i)) { case OPTIONS: TextView name = view.findViewById(R.id.listViewTitle); TextView description = view.findViewById(R.id.listViewDescription); name.setText(((AccountSettingsOptions) list.get(i)).getName()); description.setText(((AccountSettingsOptions) list.get(i)).getDescription()); break; case HEADER: TextView title = view.findViewById(R.id.optionListViewHeader); title.setText(((String) list.get(i))); break; } return view; } }
Erreur: p >
import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ListView; import android.widget.RelativeLayout; import com.archive.pod.R; import com.archive.pod.Utils.SectionsStatePagerAdapter; import java.util.ArrayList; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.ViewPager; public class AccountSettingsActivity extends AppCompatActivity { //Initializing private Context mContext; private SectionsStatePagerAdapter pagerAdapter; private ViewPager mViewPager; private RelativeLayout mRelativeLayout; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_accountsettings); mContext = AccountSettingsActivity.this; mViewPager = findViewById(R.id.container); mRelativeLayout = findViewById(R.id.relLayout1); //Account Settings Options List Initializer setupSettingsList(); //Account Settings Options Fragment Initializer setupFragments(); //Back Arrow Initialization for Navigation Back to "Profile Activity" ImageButton backArrow = findViewById(R.id.back_arrow); backArrow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } private void setupFragments() { pagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager()); pagerAdapter.addFragment(new EditProfileFragment(), getString(R.string.editProfile)); //fragment 0 pagerAdapter.addFragment(new LogoutFragment(), getString(R.string.logout)); // fragment 1 } //Allows for the overlay to show fragment on top of account settings activity private void setViewPager(int fragmentNumber) { mRelativeLayout.setVisibility(View.GONE); mViewPager.setAdapter(pagerAdapter); mViewPager.setCurrentItem(fragmentNumber); } //All Options in Account Settings private void setupSettingsList() { ListView listView = findViewById(R.id.lvAccountSettings); ArrayList < Object > options = new ArrayList < > (); options.add(("My Account")); options.add(new AccountSettingsOptions("Edit Profile", "Change your profile information.")); //fragment 0 options.add(("Notifications")); options.add(new AccountSettingsOptions("Notifications", "Manage preferences for notifications.")); //fragment 1 options.add(("Privacy Settings")); options.add(new AccountSettingsOptions("Privacy", "Manage your privacy settings.")); //fragment 2 options.add(new AccountSettingsOptions("Privacy Policy", "Important for both of us.")); //fragment 3 options.add(("More")); options.add(new AccountSettingsOptions("Ads", "Learn more about the ads you see.")); //fragment 4 options.add(new AccountSettingsOptions("Support", "Get help from us and the community.")); //fragment 5 options.add(new AccountSettingsOptions("Logout", "See you next time.")); //fragment 6 listView.setAdapter(new AccountSettingsAdapter(this, options)); //Navigation to fragment page listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView < ? > parent, View view, int position, long id) { setViewPager(position); } }); } }
J'ai inclus tout le code, alors n'hésitez pas à créer votre propre projet!
3 Réponses :
En regardant la trace de la pile de l'exception ici
TextView name = view.findViewById(R.id.listViewTitle); TextView description = view.findViewById(R.id.listViewDescription);
indique que setText est appelé sur un TextView qui n'existe pas et qui est nul. Dans AccountSettingsAdapter, vous gonflez l'une de ces activités avec ces dispositions:
R.layout.activity_accountsettings ou R.layout.listview_section_header_accountsettings
Le numéro de ligne 78 du stacktrace suggère que ces Textviews ne sont pas trouvés:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.archive.pod.Profile.AccountSettingsAdapter.getView(AccountSettingsAdapter.java: 78)
Il n'y a pas de TextViews avec des identifiants correspondant à un ou à la fois de R.id.listViewTitle ou / et R.id.listViewDescription dans les activités que vous créez ci-dessus.
Il vous suffit de référencer les vues correspondantes dans l'activité cible respective. Essayez de mettre un point d'arrêt dans cette instruction switch pour confirmer exactement ce qui se passe.
Problème résolu
Il y a une erreur de syntaxe dans listView.setOnItemClickListener ... onItemClick (AdapterView parent ... il y a un
Merci d'avoir fait remarquer cela! C'est étrange, cela n'apparaît pas dans mon code réel, mais après l'avoir ajusté, cela n'a pas résolu mon problème :(
Il y a quelques vues que vous n'avez pas incluses ci-dessus, à savoir TextView name = view.findViewById (R.id.listViewTitle); TextView description = view.findViewById (R.id.listViewDescription); Est-ce que ça va? - c'est à dire non nul. Et puis déboguer la liste ci-dessous est-ce que cela donne un aperçu? name.setText (((AccountSettingsOptions) list.get (i)). getName ()); description.setText (((AccountSettingsOptions) list.get (i)). getDescription ());
Donc, quand je survole le findViewById (R.id.listViewTitle); il dit, findViewById peut produire «NullPointerException». Je ne sais pas si cela peut être le problème. En ce qui concerne votre commentaire sur le fait de ne pas inclure certains points de vue. Je ne sais pas de quoi vous parlez. Pourriez-vous s'il vous plaît potentiellement copier-coller et ajuster mon code dans votre réponse, mauvais copier-coller et voir si cela fait une différence. Merci beaucoup pour votre aide
DIEU VOUS PROTÈGE! Haha, merci beaucoup
D'après ce que je peux dire, le problème doit être dans cette ligne dans votre AccountSettingsAdapter.java
case OPTIONS: view = inflater.inflate(R.layout.activity_accountsettings, viewGroup, false);
êtes-vous sûr de gonfler la bonne vue pour les lignes dans le list, cette disposition est pour le AccountSettingsActivity.java
qui contient la liste que vous essayez de remplir. De plus, cette mise en page ne semble pas contenir de champs comme R.id.listViewTitle
etc. comme l'autre gars mentionné dans ses commentaires, à moins que vous n'incluiez d'autres vues qui l'ont dans son xml.
d'une manière ou d'une autre dans AccountSettingsAdapter dans le code ci-dessous
switch (getItemViewType(i)) { case OPTIONS: TextView name = view.findViewById(R.id.listViewTitle); TextView description = view.findViewById(R.id.listViewDescription); name.setText(((AccountSettingsOptions) list.get(i)).getName()); description.setText(((AccountSettingsOptions) list.get(i)).getDescription()); break; case HEADER: TextView title = view.findViewById(R.id.optionListViewHeader); title.setText(((String) list.get(i))); break;
Le nom et la description n'ont pas été initialisés avec succès, donc le nom provoque une erreur de référence d'obejcet nulle.
pouvez-vous publier snippet_top_accountsettingtoolbar.xml