当前位置: 首页 > 面试题库 >

导航抽屉标题textview nullpointerexception

盛城
2023-03-14
问题内容

我有一个2活动和一个服务,首先我有导航抽屉,并且标题中有2个textview,有时我必须更改它们的文本,在服务中我需要一些数据。
第一次运行时一切都很完美,但是当我从第二个转到第一个活动,我在textviews中有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)

问题答案:

要在Navigation
Drawer的标题中成功找到任何小部件,您需要首先获取标题视图。这可以通过使用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());


 类似资料:
  • 虽然我一直在四处寻找,但找不到正确的答案。在我的抽屉菜单头,我为用户提供了他的图像和姓名,但我也允许用户从应用程序中更改他/她的姓名和图像。这些更改存储在会话管理器中。现在我想在我的抽屉菜单头反映这些更改。一切都很好,因为当我关闭应用程序并再次运行它时,它显示了更改。所以现在我需要的是一种刷新抽屉菜单头的方法。 从配置文件片段中的库中选择图像。 主页活动

  • 实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当

  • 我正在为我的应用程序实现一个导航抽屉。现在,除了一个小故障外,它工作正常。当我设置导航抽屉图标(ic_Drawer)来替换常规的“HomeAsUp”插入符号图标时,我仍然得到箭头。导航抽屉图标不显示。我已经实现了android开发者网站上的每一种方法。但它似乎不起作用。 以下是我的代码:

  • 有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:

  • 我在将与和组合时遇到布局问题。 问题是,NavigationDrawer及其内容隐藏在工具栏后面。我已经做了很多研究,尝试了很多重组,但没有一个“解决方案”能解决我的问题。 在这个Webm小视频中可以找到一个演示:https://www.dropbox.com/s/i5zfc2x2ts2fws7/navigation_drawer_stackoverflow32523188.webm?dl=0 基

  • 有人知道如何实现一个滑动菜单像一些顶级应用程序今天吗? 其他堆栈溢出问题还没有关于如何做到这一点的答案,所以我正在尝试收集尽可能多的信息来帮助其他人。我在下面提到的所有应用程序都很好地实现了幻灯片菜单。 只有点击左上角的G+标识,才能从第一屏进入第二屏。注意,整个屏幕从它的位置移动,并且get被推到屏幕的右侧(包括操作栏)。要回到第一个屏幕,您可以将右侧滑回焦点,也可以再次单击G+图标。 您可以使