2016-03-04 68 views
1

我有MainActivite。我尝试将文本设置为TextView tvUserName。 直到今天一切正常,但现在我无法通过findViewById访问此变量。此变量的值为null。无法访问TextView

也许这是一个错误的代码,它会在系统库更新后停止正常工作。

我没有做任何特别的事情,不明白该怎么做。

Caused by: java.lang.NullPointerException 

当我尝试将文本设置为这个变量

private static TextView tvUserName; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     currentLocale = getResources().getConfiguration().locale; 
     LocaleHelper.onCreate(this, currentLocale + ""); 
     setContentView(R.layout.activity_main); 

     context = this; 

     fragmentManager = getSupportFragmentManager(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(MainActivity.this); 
     navigationView.setEnabled(false); 

     DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

     tvUserName = (TextView) findViewById(R.id.navUserName); 

     //????? 
    } 

--------- activity_main.xml中--------------- ---

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

    <android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" 
     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" 
       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> 

</LinearLayout> 

------- nav_header_main -----------------

<?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="wrap_content" 
    android:paddingLeft="16dp" 
    android:background="@drawable/side_nav_bar" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark" android:orientation="vertical" 
    android:gravity="bottom"> 

    <TextView android:layout_width="match_parent" android:layout_height="wrap_content" 
     android:paddingTop="@dimen/nav_header_vertical_spacing" android:text="Phone4Pay" 
     android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="2dp" 
     android:paddingBottom="15dp" > 
     <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" 
      android:id="@+id/navUserName"/> 

    </LinearLayout> 
</LinearLayout> 
+0

您使用的是什么IDE?您尝试清洁该项目? –

+0

AndroidStudio 1.4,该怎么做? – koa73

回答

2
TextView tv = (TextView)navigationView.findViewById(id); 

原因TextView位于headerLayout中,而headerLayout是navigationView的根布局。

这个答案是错误的。

get more here

+0

我添加了navigationView - 没有任何结果同样的问题 – koa73

+0

对不起,我的答案没有验证。通过IgorB答案比我的更接近。 – grantonzhuang

3
navigationView = (NavigationView)findViewById(R.id.nav_header_main); 
    View headerLayout = navigationView.getHeaderView(0); 
    tvUserName = (TextView) headerLayout.findViewById(R.id.navUserName); 
+0

@ user5546244试试这个 – IgorB

+0

非常感谢!!!!!!!它帮助了我。为什么它的工作原理? – koa73

+0

@ user5546244,因为我们需要指定标题位置。 – IgorB

0

的主要原因是从

compile 'com.android.support:design:23.0.1' 

改变支持版本的lib

compile 'com.android.support:design:23.1.1' 

但在旧版本(23.0.1)此代码的工作确定:

tvUserName = (TextView) findViewById(R.id.navUserName); 

这个代码不常见的工作“不能识别方法getHeaderView”

View headerLayout = navigationView.getHeaderView(0); 

要小心,当你改变支持库版本,开发者可以在没有任何警告的情况下改变一切没有后援。