1

我有一個2活動和服務,第一我有抽屜式導航和2個textviews在它的頭,我有時必須改變他們的文本中,在服務有一些數據,我需要
首先,一切都是完美的,但是當我從第二個角度開始第一個活動時,我在textviews中有nullpointerexception。是什麼原因造成的,以及如何解決?抽屜式導航欄標題的TextView NullPointerException異常

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

    //Navigation drawer init 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbarMain); 
    setSupportActionBar(toolbar); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.addDrawerListener(toggle); 
    toggle.syncState(); 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view_main); 
    navigationView.setNavigationItemSelectedListener(this); 

    intent = new Intent("playbackservice"); 
    sConn = new ServiceConnection() { 

     public void onServiceConnected(ComponentName name, IBinder binder) { 
      Log.d(LOG_TAG, "MainActivity onServiceConnected"); 
      service = ((PlaybackService.PlaybackServiceBinder) binder).getService(); 
      bound = true; 
      prepareLayout(); 
     } 

     public void onServiceDisconnected(ComponentName name) { 
      Log.d(LOG_TAG, "MainActivity onServiceDisconnected"); 
      bound = false; 
     } 
    }; 
} 

private void prepareLayout() { 
    Log.d(LOG_TAG, "prepareLayout: Running"); 
    ((TextView) findViewById(R.id.songNameNavhead)).setText(currentSong.getName()); 
    ((TextView) findViewById(R.id.artistNavhead)).setText(currentSong.getArtist()); 
} 

而且

//Layout nav_header_main.xml 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/nav_header_height" 
      android:gravity="bottom" 
      android:orientation="vertical" 
      android:background="@color/colorPrimaryDark" 
      android:paddingBottom="@dimen/activity_vertical_margin" 
      android:paddingLeft="@dimen/activity_horizontal_margin" 
      android:paddingRight="@dimen/activity_horizontal_margin" 
      android:paddingTop="@dimen/activity_vertical_margin" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark"> 


<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="@string/default_song_name" 
    android:id="@+id/songNameNavhead"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/default_artist" 
    android:id="@+id/artistNavhead"/> 
</LinearLayout> 

而且

//activity_main.xml 
<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

<include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view_main" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer"/> 

</android.support.v4.widget.DrawerLayout> 

錯誤

05-12 19:34:05.001 11086-11086/iskandarovlev.myitschool.ru.lyricplayer E/AndroidRuntime: FATAL EXCEPTION: main 
          Process: iskandarovlev.myitschool.ru.lyricplayer, PID: 11086 
          java.lang.NullPointerException 
          //MainActivity.java:302 is 
          //((TextView) header.findViewById(R.id.songNameNavhead)).setText(currentSong.getName()); 
          //this line 
          at iskandarovlev.myitschool.ru.lyricplayer.MainActivity.prepareLayout(MainActivity.java:302) 
          at iskandarovlev.myitschool.ru.lyricplayer.MainActivity.access$700(MainActivity.java:48) 
          at iskandarovlev.myitschool.ru.lyricplayer.MainActivity$3.onServiceConnected(MainActivity.java:355) 
          at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1140) 
          at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1157) 
          at android.os.Handler.handleCallback(Handler.java:808) 
          at android.os.Handler.dispatchMessage(Handler.java:103) 
          at android.os.Looper.loop(Looper.java:193) 
          at android.app.ActivityThread.main(ActivityThread.java:5542) 
          at java.lang.reflect.Method.invokeNative(Native Method) 
          at java.lang.reflect.Method.invoke(Method.java:515) 
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:657) 
          at dalvik.system.NativeStart.main(Native Method) 

回答

11

要successfuly尋找小部件抽屜式導航欄的標題,你需要獲得其頭認爲,首先,這與使用getHeaderView()完成:

View header = ((NavigationView)findViewById(R.id.navigation_view)).getHeaderView(0); 

然後,將具有header指向右邊ViewGroup,你可以在上面使用普通findViewById()像往常一樣:

TextView tv = header.findViewById(R.id.songNameNavhead); 
tv.setText(currentSong.getName()); 

或以更緊湊的方式:

((TextView)header.findViewById(R.id.songNameNavhead)) 
       .setText(currentSong.getName()); 
0
private void prepareLayout() { 
    Log.d(LOG_TAG, "prepareLayout: Running"); 
    ((TextView) findViewById(R.id.songNameNavhead)).setText(currentSong.getName()); 
    ((TextView) findViewById(R.id.artistNavhead)).setText(currentSong.getArtist()); 
} 

這些需要使用navigationDrawer的VI EW然後它的頭,不是你的活動的看法,所以它應該是

View header = navigationView.getHeaderView(0) 

((TextView) navigationViewHeader.findViewById(R.id.songNameNavhead)).setText(currentSong.getName()); 
((TextView) navigationViewHeader.findViewById(R.id.artistNavhead)).setText(currentSong.getArtist()); 
+0

不,不工作。此外,我的代碼,這在第一次啓動工作,所以它不能是錯誤的ID或別的東西 – Masafi