0

그래,이 문제에 대한 해결책을 찾고 있었는데 발견 한 모든 해결책이 작동하지 않습니다. 내 navigationView에서 Sign In 버튼의 텍스트를 변경하려고합니다. 로그인 여부에 따라 Sign In/Sign In을 선택하고 버튼을 누르면 로그인 또는 로그 아웃하도록합니다. 어떤 이유로 내 응용 프로그램이 null 객체 참조 (아래 로그 중 일부)에 치명적인 예외로 인해 충돌합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?navigationView setText null 객체 참조에 치명적인 예외가 발생했습니다.

"signInOutText();"가 생성되었습니다. 그래서 나는 다른 장소에 그것을 배치하려고 할 수 있습니다, 그것은 현재 onResume에 있지만 나는 onCreate에서 시도하고 원래 onResume에서 모두했다. 잘만되면 나는 단순한 무엇인가를 간과하고있다. 나는 내 코드 중 일부를 MainActivity.java 아래에서 자른 것이므로 너무 길지 않았지만 모든 것을보아야하는지 알고 싶습니다.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

//Defining Variables 
private Toolbar toolbar; 
private NavigationView navigationView; 
private DrawerLayout drawerLayout; 
String category; 
MenuItem mPreviousMenuItem; 

private ProgressDialog mProgressDialog; 

String providerId,uid,name,email; 
Uri photoUrl; 

private static final String TAG = "MainActivity"; 

// set name of your preferences list 
private static String MY_PREFERENCES = "Settings"; 
String userNameLoad, emailLoad, profileLoad; 
TextView usernameTextView, emailTextView, signInTextView; 

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

    // Initializing Toolbar and setting it as the actionbar 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //Initializing NavigationView 
    navigationView = (NavigationView) findViewById(R.id.navigation_view); 


    //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     // This method will trigger on item Click of navigation menu 
     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 

      menuItem.setCheckable(true); 
      menuItem.setChecked(true); 
      if (mPreviousMenuItem != null) { 
       mPreviousMenuItem.setChecked(false); 
      } 
      mPreviousMenuItem = menuItem; 

      //Closing drawer on item click 
      drawerLayout.closeDrawers(); 


      //Check to see which item was being clicked and perform appropriate action 
      switch (menuItem.getItemId()){ 

       //Replacing the main content with fragments      
       case R.id.home: 
        //code for button 
        break; 
       case R.id.cat1: 
        //code for button 
        break; 
       case R.id.signIn:       
        signInOut(); 
        break; 
       default:       
        break; 
      }    

      return true; 
     } 
    }); 

    // Initializing Drawer Layout and ActionBarToggle 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer); 
    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.openDrawer, R.string.closeDrawer){ 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank 
      super.onDrawerClosed(drawerView); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      // Code here will be triggered once the drawer open as we don't want anything to happen so we leave this blank 

      super.onDrawerOpened(drawerView); 
     } 
    }; 

    //Setting the actionbarToggle to drawer layout 
    drawerLayout.setDrawerListener(actionBarDrawerToggle); 

    //calling sync state is necessary or else your hamburger icon wont show up 
    actionBarDrawerToggle.syncState(); 
} 

private void signInOutText() { 

    //Initializing NavigationView 
    navigationView = (NavigationView) findViewById(R.id.navigation_view); 
    //Get header xml from navigationView 
    View header = navigationView.getHeaderView(0); 

    //Check if user logged in, change sign in sign out button to correct text 
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if (user != null) { 
     signInTextView = (TextView) header.findViewById(R.id.signIn); 
     signInTextView.setText(R.string.sign_out); 
    } else { 
     signInTextView = (TextView) header.findViewById(R.id.signIn); 
     signInTextView.setText(R.string.sign_in); 
    } 
} 

private void signInOut(){ 
    //TODO add Code .... if logged in logout 
    Intent intent = new Intent(MainActivity.this, ChooserActivity.class); 
    startActivity(intent); 
    finish(); 

} 

public void setActionBarTitle(String title) { 
    if(getSupportActionBar() != null){ 
     getSupportActionBar().setTitle(title); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    // Set title 
    setActionBarTitle(getString(R.string.app_name)); 
    signInOutText(); 
} 

}

로그인

Unable to resume activity {com.test.app/com.test.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void 
android.widget.TextView.setText(int)' on a null object reference 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3361) 
at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7229) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(int)' on a null object reference 
at com.test.app.MainActivity.signInOutText(MainActivity.java:203) 
at com.test.app.MainActivity.onResume(MainActivity.java:307) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1286) 
at android.app.Activity.performResume(Activity.java:6987) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250)  
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3361)  
at android.app.ActivityThread.access$1100(ActivityThread.java:222)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:158)  
at android.app.ActivityThread.main(ActivityThread.java:7229)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

activity_main.xml

01,233 도움을

메뉴/drawer.xml는

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <group android:id="@+id/drawer_group" 
     android:checkable="true"> 


     <item 
      android:id="@+id/home" 
      android:checked="false" 
      android:icon="@drawable/ic_home_black_24dp" 
      android:title="@string/home_string" /> 
    </group> 

    <group android:id="@+id/group_cat" 
     android:checkable="true"> 

     <item 
      android:id="@+id/menuCategories" 
      android:title="@string/categories_string" 
      android:layout_gravity="bottom"> 

      <menu> 

       <item 
        android:id="@+id/cat1" 
        android:checked="false" 
        android:icon="@drawable/ic_inbox_black" 
        android:title="@string/cat1_string" /> 

      </menu> 

     </item> 

    </group> 


    <group android:id="@+id/group_signInOut" 
     android:checkable="true"> 

     <item 
      android:id="@+id/signIn" 
      android:checked="false" 
      android:icon="@drawable/ic_power_settings_new_black_24dp" 
      android:title="@string/sign_in" /> 

    </group> 

</menu> 

감사합니다!

답변

1

좋아, 그래서 내가 "메뉴"항목 및 텍스트보기를 업데이 트하려고 것을 깨닫게 큰 차이를 만들었습니다. 다음은 작동하도록 signInOutText()에서 사용한 코드입니다.

private void signInOutText() { 

     // get menu from navigationView 
     Menu menu = navigationView.getMenu(); 

     // find MenuItem you want to change 
     MenuItem nav_signIn = menu.findItem(R.id.signIn); 

     //Check if user logged in, change sign in/out button to correct text 
     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     if (user != null) { 
      nav_signIn.setTitle(R.string.sign_out); 
     } else { 
      nav_signIn.setTitle(R.string.sign_in); 
     } 
    } 

나는 누군가를 돕기를 바랍니다. 도와 주셔서 감사합니다!