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