-1

J'apprends comment coder et développer des applications pour Android, et j'essaie actuellement de créer une appli News. Mais je reçois cette erro quand j'essaie d'exécuter l'application: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle 'java.lang.Object android.content.Context.getSystemService (java.lang.String)' sur un référence d'objet nul.Je reçois une erreur (java.lang.NullPointerException) lorsque j'essaie d'exécuter mon application

Les applications fonctionnaient bien au début, quand était juste une activité. Mais j'ai ensuite essayé de l'utiliser en utilisant viewpagers, j'ai corrigé un tas d'erreurs, mais celui-ci je ne peux pas savoir ce qui se passe. J'ai lu des choses sur la façon de corriger un NullPointerException mais je ne peux toujours pas le réparer.

Voici le code:

S'IL VOUS PLAÎT, LES COMMENTAIRES ET IGNORE DOCUMENTATIONS EN PORTUGAIS, je viens juste writed IT TOUTE FAÇON QUI, UNORGANIZED. (J'AI PRÉVOYÉ DE S'INFORMER APRÈS AVOIR TERMINÉ LE CODE).

package com.example.android.news; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.Loader; 
import android.content.Context; 
import android.content.Intent; 

import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.net.Uri; 
import android.support.annotation.Nullable; 
import android.os.Bundle; 

import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class NewsFragment extends Fragment implements android.support.v4.app.LoaderManager.LoaderCallbacks<List<News>> { 

    public NewsFragment(){ 
     // Required empty public constructor 
    } 

    //Contexto do app 
    private Context mContext = getContext(); 

    public static final String LOG_TAG = NewsFragment.class.getName(); 

    /** Adapter da lista de news */ 
    private NewsAdapters mAdapter; 

    /** URL para o dado da notícia (news) do dataset do The Gardian */ 
    private static final String THE_GARDIAN_DATASET = 
      "https://content.guardianapis.com/search?api-key=4a8dba55-ace9-40bf-8a3c-05a1d2eebd65"; 

    /** 
    * Valor constante para o ID do loader de news. Podemos escolher qualquer inteiro. 
    * Isto só importa realmente se você estiver usando múltiplos loaders. 
    */ 
    private static final int NEWS_LOADER_ID = 1; 

    /** TextView que é mostrada quando a lista é vazia */ 
    private TextView mEmptyStateTextView; 

    /** ProgressBar que é mostrada enquanto o app busca dados do servidor */ 
    private ProgressBar mLoadingSpinner; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_news , container, false); 

     final ArrayList<News> newses = new ArrayList<News>(); 

     // Acha uma referência para a {@link ListView} no layout 
     ListView newsListView = (ListView) rootView.findViewById(R.id.list); 

     if (getTag() != null){ 
      // Cria um novo adapter que pega uma lista vazia de news como entrada 
      mAdapter = new NewsAdapters(mContext, newses); 

      // Seta o adapter na {@link ListView} 
      // para que a lista pode ser populada na interface do usuário 
      newsListView.setAdapter(mAdapter); 
     } 

     //Acha uma referencia para a {@link TextView} 
     mEmptyStateTextView = (TextView) rootView.findViewById(R.id.empty_state_text_view); 

     //Acha uma referencia para a {@link ProgressBar} 
     mLoadingSpinner = (ProgressBar) rootView.findViewById(R.id.loading_spinner); 

     //Seta um emptyState {@ link emptyView} na ListView {@ link earthquakeListView} 
     newsListView.setEmptyView(mEmptyStateTextView); 

     newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       // Acha a news atual que foi clicado 
       News currentNews = mAdapter.getItem(position); 

       //Converte a URL da String em um objeto URI (para passar no construtor da Intent) 
       Uri newsUri = Uri.parse(currentNews.getmWebUrl()); 

       // Cria um novo intent para visualizar o URI 
       Intent webIntent = new Intent(Intent.ACTION_VIEW, newsUri); 

       // Envia a intent para lançar uma nova activity 
       startActivity(webIntent); 
      } 
     }); 

     //Cria um objeto da classe para monitorar a conexão com a internet 
     ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 

     //Verifica o estado da conexão 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 

     if (isConnected){ 
      // Obtém uma referência ao LoaderManager, a fim de interagir com loaders. 
      LoaderManager loaderManager = getLoaderManager(); 

      // Inicializa o loader. Passa um ID constante int definido acima e passa nulo para 
      // o bundle. Passa esta activity para o parâmetro LoaderCallbacks (que é válido 
      // porque esta activity implementa a interface LoaderCallbacks. 
      loaderManager.initLoader(NEWS_LOADER_ID, null, this); 
     } else { 
      mLoadingSpinner.setVisibility(View.GONE); 
      mEmptyStateTextView.setText(R.string.no_internet); 
     } 

     return rootView; 
    } 

    @Override 
    public Loader<List<News>> onCreateLoader(int id, Bundle args) { 

     Uri baseUri = Uri.parse(THE_GARDIAN_DATASET); 
     Uri.Builder uriBuilder = baseUri.buildUpon(); 

     // Criar um novo loader para a dada URL 
     return new NewsLoader(getContext(), uriBuilder.toString()); 
    } 

    @Override 
    public void onLoadFinished(Loader<List<News>> loader, List<News> news) { 
     //Hide the LoadingSpinner when the loading is finished 
     mLoadingSpinner.setVisibility(View.GONE); 

     //Seta o texto a ser mostrado caso não haja news a serem mostrados 
     mEmptyStateTextView.setText(R.string.empty_state); 

     // Limpa o adapter de dados de news anteriores 
     mAdapter.clear(); 

     // Se há uma lista válida de {@link News}s, então os adiciona ao data set do adapter. 
     // Isto ativará a atualização da ListView. 
     if (news != null && !news.isEmpty()) { 
      mAdapter.addAll(news); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<List<News>> loader) { 
     // Reseta o Loader, então podemos limpar nossos dados existentes. 
     mAdapter.clear(); 
    } 
} 

Et le logcat:

09-29 16:17:44.553 26644-26644/com.example.android.news E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.android.news, PID: 26644 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
                       at android.view.LayoutInflater.from(LayoutInflater.java:233) 
                       at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:181) 
                       at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:166) 
                       at com.example.android.news.NewsAdapters.<init>(NewsAdapters.java:0) 
                       at com.example.android.news.NewsFragment.onCreateView(NewsFragment.java:69) 
                       at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
                       at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) 
                       at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) 
                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
                       at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
                       at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984) 
                       at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
                       at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
                       at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
                       at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
                       at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
                       at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459) 
                       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
                       at com.android.internal.policy.DecorView.onMeasure(DecorView.java:849) 
                       at android.view.View.measure(View.java:21051) 
                       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2583) 
                       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1642) 
                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1893) 
                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1522) 
                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7098) 
                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927) 
                       at android.view.Choreographer.doCallbacks(Choreographer.java:702) 
                       at android.view.Choreographer.doFrame(Choreographer.java:638) 
09-29 16:17:44.553 26644-26644/com.example.android.news E/AndroidRuntime:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6682) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

Je ne peux pas le comprendre ce qui est faux. Je voudrais aprécier si quelqu'un pouvait m'aider!

+0

Re votre « s'il vous plaît ignorer », il est préférable d'écrire correctement en premier lieu, plutôt que de mettre les bugs seulement devoir les enlever à nouveau. Ne pratiquez pas votre profession comme ça. – EJP

+0

Concernant le point par EJP. S'il vous plaît voir comment faire un [mcve] –

Répondre

1

Mettre cela sur d'actualité méthode onCreateView():

this.mContext = getActivity(); 

Et votre problème sera résolu. Les fragments n'ont pas de contextes qui dépendent de l'activité dans laquelle ils se trouvent.

+0

Hows cette méthode de travail, alors? https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Fragment.java#L833-L838 –

+0

Vous avez downvoted et étonnamment vous avez donné la même réponse. Seulement moi je l'ai fait plus simple. Quand OnAttach est appelé le même Contexte de l'Activité est passé donc s'il vous plaît! Upvote ma réponse ou allez essayer de tester le code au lieu de downvoter les vraies réponses! – Xenolion

+0

Le contexte est null jusqu'à ce que le fragment soit attaché. Changer la méthode de champ ne résout pas le problème –

1

Modifier ceci:

//Cria um objeto da classe para monitorar a conexão com a internet 
    ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 

à:

//Cria um objeto da classe para monitorar a conexão com a internet 
     ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
+0

Le champ de contexte est nul à ce point –

+1

Essayez: rootView.getContext() – namezhouyu

-1

Le contexte est null jusqu'à ce que le fragment soit attaché à l'activité.

Vous avez besoin de cette fonction

//Contexto do app 
private Context mContext; 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.mContext = context; 
}