ActionBar.setDisplayHomeAsUpEnabled on a null 对象引用



在我的项目中,我收到此错误

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);
}
}
}

}

您可能缺少样式windowActionBar项.xml

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

错误消息告诉您此行上的actionbar为 null

actionbar.setDisplayHomeAsUpEnabled(true);

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

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

您可能还想查看它返回 null的一些可能原因。例如,根据发生这种情况的 android 版本,将windowNoTitle设置为 true 可能会导致没有操作栏,并从该调用中获得 null(请参阅此处(。

最新更新