有人可以向我解释下面这个神秘的logcat消息,并解释如何解决下面代码中的问题。谢谢你,节日快乐:)
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)' on a null object reference
at com.meguillaume.cloudmusic.MainActivity.onCreateOptionsMenu(MainActivity.java:183)
at android.app.Activity.onCreatePanelMenu(Activity.java:3142)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:360)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:331)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61)
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:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
private static final String TAG = "MainActivity";
private TracksAdapter mAdapter;
//List is actually an interfact (Hold down command and left click to view.) and arraylist is
//actually a class that implements that interface.
private List<Track> mTracks;
private TextView mSelectedTitle;
private ImageView mSelectedThumbnail;
private MediaPlayer mMediaPlayer;
private ImageView mPlayerStateButton;
private SearchView mSearchView;
private List<Track> mPreviousTracks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
toggleSongState();
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mPlayerStateButton.setImageResource(R.drawable.ic_play);
}
});
toolbar = (Toolbar) findViewById(R.id.player_toolbar);
mSelectedTitle = (TextView) findViewById(R.id.selected_title);
mSelectedThumbnail = (ImageView) findViewById(R.id.selected_thumbnail);
mPlayerStateButton = (ImageView) findViewById(R.id.player_state);
mPlayerStateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleSongState();
}
});
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.songs_list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
mTracks = new ArrayList<Track>(); //BC of the list interface array list can implement here
mAdapter = new TracksAdapter(this, mTracks);
mAdapter.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Track selectedTrack = mTracks.get(position);
mSelectedTitle.setText(selectedTrack.getTitle());
Picasso.with(MainActivity.this).load(selectedTrack.getAvatarURL()).into(mSelectedThumbnail);
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.reset();
try {
mMediaPlayer.setDataSource(selectedTrack.getStreamURL() + "?client_id=" + SoundCloudService.CLIENT_ID);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
});
recyclerView.setAdapter(mAdapter);
SoundCloudService service = SoundCloud.getService();
service.getRecentSongs(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()), new Callback<List<Track>>() {
@Override
public void success(List<Track> tracks, Response response) {
updateTracks(tracks);
}
@Override
public void failure(RetrofitError error) {
Log.d(TAG, "Error is " + error);
}
});
}
private void updateTracks(List<Track> tracks) {
mTracks.clear();
mTracks.addAll(tracks);
mAdapter.notifyDataSetChanged();
}
private void toggleSongState() {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
mPlayerStateButton.setImageResource(R.drawable.ic_play);
} else {
mMediaPlayer.start();
mPlayerStateButton.setImageResource(R.drawable.ic_pause);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
}
@Override
public boolean onQueryTextSubmit(String query) {
mSearchView.clearFocus();
SoundCloud.getService().searchSongs(query, new Callback<List<Track>>() {
@Override
public void success(List<Track> tracks, Response response) {
updateTracks(tracks);
}
@Override
public void failure(RetrofitError error) {
}
});
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
mSearchView = (SearchView) menu.findItem(R.id.search_view).getActionView();
mSearchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.search_view), new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
mPreviousTracks = new ArrayList<Track>(mTracks);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
updateTracks(mPreviousTracks);
return true;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.search_view) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:0)
程序文件的第183行附近有一行调用
mSearchView.setOnQueryTextListener(this);
但mSerachView仍为null(这可能意味着之前的行,关于menu.findItem(),返回null)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
mSearchView = (SearchView) menu.findItem(R.id.search_view).getActionView();
mSearchView.setOnQueryTextListener(this); // <--- This line gave you the NullPointerException
MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.search_view), new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
mPreviousTracks = new ArrayList<Track>(mTracks);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
updateTracks(mPreviousTracks);
return true;
}
});
return true;
}