0

J'ai un TextView fonctionnant comme un badge de notification sur un élément de menu. Le problème est que la méthode findViewById renvoie toujours une valeur nulle après un changement d'orientation, donc quand j'essaie de modifier sa visibilité avec setVisibility, elle lance une exception NullPointerException. J'ai essayé à nouveau d'appeler le onCreateOptionsMenu en appelant invalidateOptionsMenu dans onRestart mais cela ne semble pas aider. De ce que je peux dire que chaque autre vue est trouvée et c'est juste ce TextView qui est une nuisance.TextView dans le menu est toujours nul après le changement d'orientation

La partie où il se bloque (ce qui est appelé à onCreate):

public void updateUnreadNotificationCount(final int unreadNotificationsCount) { 
    unreadNotificationCount = unreadNotificationsCount; 
    if (unreadNotificationCount == 0) { 
     notificationCounter.setVisibility(View.INVISIBLE); 
    }else { 
     notificationCounter.setVisibility(View.VISIBLE); 
     notificationCounter.setText(String.valueOf(unreadNotificationCount)); 
    } 
} 

Comment le Textview est créé:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 

    View count = menu.findItem(R.id.action_notifications).getActionView(); 
    notificationCounter = (TextView) count.findViewById(R.id.textview_notification_count); 
    count.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(mCtx, NotificationListActivity.class); 
      startActivity(i); 
     } 
    }); 
    notificationCounter.setText(String.valueOf(unreadNotificationCount)); 
    return super.onCreateOptionsMenu(menu); 
} 

Le XML pour l'élément de menu:

<item 
    android:id="@+id/action_notifications" 
    android:title="@string/action_notifications" 
    android:icon="@drawable/ic_mail_white_48dp" 
    android:actionLayout="@layout/actionbar_notification_icon" 
    android:showAsAction="always" 
    app:showAsAction="always" 
    android:orderInCategory="60"/> 

La disposition de l'action pour le TextView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:clickable="true" 
      style="@android:style/Widget.ActionButton"> 

<ImageView 
    android:id="@+id/imageview_notification" 
    android:src="@drawable/ic_mail_white_48dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:layout_margin="0dp"/> 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/textview_notification_count" 
      android:layout_width="wrap_content" 
      android:minWidth="17sp" 
      android:textSize="12sp" 
      android:textColor="#ffffffff" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:text="@null" 
      android:layout_alignTop="@id/imageview_notification" 
      android:layout_alignRight="@id/imageview_notification" 
      android:layout_marginRight="0dp" 
      android:layout_marginTop="3dp" 
      android:paddingBottom="1dp" 
      android:paddingRight="4dp" 
      android:paddingLeft="4dp" 
      android:background="@drawable/rounded_square"/> 

</RelativeLayout> 

Répondre

0

Managed pour résoudre le problème en déplaçant l'initialisation du TextView dans onPrepareOptionsMenu et appelant invalidateOptionsMenu() pendant onResume().