2016-12-16 131 views
-2

有人能向我解釋低於這個神祕的logcat的消息,還解釋瞭如何解決問題,在下面的代碼,以及虛方法。謝謝你,節日快樂:)你的程序文件的顯示java.lang.NullPointerException:嘗試調用

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

將menu_main佈局添加到問題 – petrumo

回答

0

近線183,有調用

mSearchView.setOnQueryTextListener(this); 

線,但mSerachView仍爲零(即之前可能意味着行,關於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; 
} 
相關問題