首页 文章

null对象引用上的ActionBar.setDisplayHomeAsUpEnabled

提问于
浏览
0

在我的项目中,我收到了这个错误

java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.siddharth.cardnews / com.example.siddharth.cardnews.MainActivity}:java.lang.NullPointerException:尝试调用虚方法'void android.support.v7空对象引用上的.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)'

package com.example.siddharth.cardnews;

import android.annotation.SuppressLint;
import android.app.LoaderManager;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.app.LoaderManager.LoaderCallbacks;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
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 MainActivity extends AppCompatActivity implements LoaderCallbacks<List<NewsData>> {

/** Tag for log messages */
public static final String LOG_TAG = NewsLoader.class.getName();
private static String NEWS_REQUEST_URL ="https://newsapi.org/v2/top-headlines?country=in&apiKey=02d5a6c928c14944b23057e1054b68d9";
private static  final  int NEWS_LOADER_ID=1;
private  NewsAdapter mAdapter;
private TextView mEmptyStateTextView;
private DrawerLayout mDrawerLayout;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar actionbar = getSupportActionBar();
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);

    mDrawerLayout = findViewById(R.id.drawer_layout);

    NavigationView navigationView = findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    int country_url = menuItem.getItemId();
                    switch (country_url) {
                        case R.id.us_news:
                            NEWS_REQUEST_URL = "https://newsapi.org/v2/top-headlines?country=us&apiKey=02d5a6c928c14944b23057e1054b68d9";
                            break;
                        case R.id.au_news:
                            NEWS_REQUEST_URL = "https://newsapi.org/v2/top-headlines?country=au&apiKey=02d5a6c928c14944b23057e1054b68d9";
                            break;
                        case R.id.ca_news:
                            NEWS_REQUEST_URL = "https://newsapi.org/v2/top-headlines?country=ca&apiKey=02d5a6c928c14944b23057e1054b68d9";
                            break;
                    }

                    LoaderManager loaderManager = getLoaderManager();
                    loaderManager.restartLoader(NEWS_LOADER_ID, null, MainActivity.this);

                    mDrawerLayout.closeDrawers();

                    return true;
                }
            });

    ListView newsListView = (ListView) findViewById(R.id.list);

    // Create a new adapter that takes an empty list of earthquakes as input
    mAdapter = new NewsAdapter(this, new ArrayList<NewsData>());

    // Set the adapter on the {@link ListView}
    // so the list can be populated in the user interface
    newsListView.setAdapter(mAdapter);

    // Set an item click listener on the ListView, which sends an intent to a web browser
    // to open a website with more information about the selected earthquake.
    newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            // Find the current earthquake that was clicked on
            NewsData currentNews = mAdapter.getItem(position);

            // Convert the String URL into a URI object (to pass into the Intent constructor)
            Uri newsUri = Uri.parse(currentNews.getmUrl());

            // Create a new intent to view the earthquake URI
            Intent websiteIntent = new Intent(Intent.ACTION_VIEW, newsUri);

            // Send the intent to launch a new activity
            startActivity(websiteIntent);
        }
    });

    mEmptyStateTextView = (TextView) findViewById(R.id.empty_view);
    newsListView.setEmptyView(mEmptyStateTextView);

    NewsAsyncTask task = new NewsAsyncTask();
    task.execute(NEWS_REQUEST_URL);

    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {

        LoaderManager loaderManager = getLoaderManager();

        loaderManager.initLoader(NEWS_LOADER_ID, null, this);
    } else {
        View loadingIndicator = findViewById(R.id.loading_spinner);
        loadingIndicator.setVisibility(View.GONE);
        mEmptyStateTextView.setText(R.string.no_internet_connection);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            mDrawerLayout.openDrawer(GravityCompat.START);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public Loader onCreateLoader(int i, Bundle bundle) {
    return new NewsLoader(this,NEWS_REQUEST_URL);
}

@SuppressLint("WrongConstant")
@Override
public void onLoadFinished(Loader<List<NewsData>> loader, List<NewsData> news) {
    mAdapter.clear();
    if(news !=null && !news.isEmpty()){
        mAdapter.addAll(news);
    }
    mEmptyStateTextView.setText(R.string.no_news);

    ProgressBar spinner= (ProgressBar)findViewById(R.id.loading_spinner);
    spinner.setVisibility(View.GONE);

}

@Override
public void onLoaderReset(Loader<List<NewsData>> loader) {
    mAdapter.clear();

}

private class NewsAsyncTask extends AsyncTask<String, Void, List<NewsData>> {

    @Override
    protected List<NewsData> doInBackground(String... urls) {
        if (urls.length < 1 || urls[0] == null) {
            return null;
        }
        List<NewsData> result = QueryUtils.fetchNewsData(urls[0]);
        return result;

    }

    @Override
    protected void onPostExecute(List<NewsData> data) {
        mAdapter.clear();

        if (data != null && !data.isEmpty()) {
            mAdapter.addAll(data);
        }
    }
}

}

2 回答

  • 0

    您可能缺少styles.xml中的 windowActionBar

    <style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
       <item name="android:windowNoTitle">true</item>
       <item name="windowActionBar">true</item>
    ...
    </style>
    
  • 0

    该错误消息告诉您 actionbar 在此行上为空

    actionbar.setDisplayHomeAsUpEnabled(true);
    

    为避免这种情况,请在使用前检查null,如下所示:

    ActionBar actionbar = getSupportActionBar();
    if( actionbar != null ) {
        actionbar.setDisplayHomeAsUpEnabled(true);
        actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);
    }
    

    您可能还想了解一下可能导致返回null的原因 . 例如,根据Android发生的版本,将 windowNoTitle 设置为true可能导致没有操作栏,并从该调用中获取null(请参阅here) .

相关问题