-1

I'm learning how to code and develop apps for android, and I'm currently trying to bild a News app. But I'm getting this erro when I try to run the app: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference.

The apps was working fine at first, when was just one Activity. But then I tried to bild it using viewpagers, I fixed a bunch of errors, but this one I can't find out what is happening. I read some things about how to fix a NullPointerException but I still can't fix it.

Here is the code:

PLEASE, IGNORE THE COMMENTS AND DOCUMENTATIONS IN PORTUGUESE, I JUST WRITED IT ANY WHICH WAY, UNORGANIZED. (I WAS PLANNING TO CARE ABOUT IT AFTER FINISH THE 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();
    }
}

And the 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)

I just can't figure it out what is wrong. I would apreciate if someone could help me!

Caio T
  • 9
  • 3
  • Re your 'please ignore', it is better to write it correctly in the first place, rather than put the bugs in only to have to take them out again. Don't practice your profession like this. – user207421 Sep 30 '17 at 01:49
  • Regarding the point by EJP. Please see how to make a [mcve] – OneCricketeer Sep 30 '17 at 01:50

3 Answers3

1

Change this:

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

to:

//Cria um objeto da classe para monitorar a conexão com a internet
        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
namezhouyu
  • 224
  • 2
  • 4
1

Put this on top within onCreateView() method:

this.mContext = getActivity();

And your problem will be solved. Fragments do not have contexts they depend on the Activity they are in.

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Xenolion
  • 12,035
  • 7
  • 33
  • 48
-1

The context is null until the Fragment is attached to the Activity.

You need this function

//Contexto do app
private Context mContext;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.mContext = context;
}
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245