1
votes

Problème d'adaptateur de paramètres de compte

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!


1 commentaires

pouvez-vous publier snippet_top_accountsettingtoolbar.xml


3 Réponses :


1
votes

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


4 commentaires

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



1
votes

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.


0 commentaires

0
votes

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.


0 commentaires