0

Ich habe eine TextView funktioniert als eine Benachrichtigung Abzeichen auf einem Menüpunkt. Das Problem ist, dass die Methode findViewById nach einer Änderung der Ausrichtung immer null zurückgibt. Wenn ich also versuche, ihre Sichtbarkeit mit setVisibility zu ändern, wird eine NullPointerException ausgelöst. Ich habe versucht, onCreateOptionsMenu erneut aufzurufen, indem ich in onRestart invalidateOptionsMenu aufruft, aber es scheint nicht zu helfen.TextView im Menü ist immer Null nach Änderung der Orientierung

Von dem, was ich sagen kann jede andere Ansicht gefunden wird und es ist nur diese TextView, die ein Ärgernis ist.

Der Teil, wo es stürzt ab (dies in onCreate genannt wird):

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)); 
    } 
} 

Wie die Textview wird erstellt:

@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); 
} 

Die XML für den Menüpunkt:

<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"/> 

Das Aktionslayout für den 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> 

Antwort

0

das Thema Managed zu beheben, indem die Initialisierung des Textview in onPrepareOptionsMenu bewegen und ruft invalidateOptionsMenu() während onResume().