I am using a custom title view in my application for each activity. In one of the activities, based on button clicks I need to change the custom title view. Now this works fine every time when I make a call to setFeatureInt.
But if I try to update any items in the custom title (say change the text of a button or a text view on the title), the update does not take place.
Debugging through the code shows that the text view and button instances are not null and I can also see the custom title bar. But the text on the text view or the button is not updated. Has anyone else faced this problem?
How do I resolve it?
Thanks.
EDIT
Here's what I tried. Does not get updated even on calling postInvalidate.
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title);
TextView databar = (TextView) findViewById(R.id.title_text);
databar.setText("Some Text");
databar.postInvalidate();
Button leftButton = (Button) findViewById(R.id.left_btn);
leftButton.setOnClickListener(mLeftListener);
leftButton.setText("Left Btn");
leftButton.postInvalidate();
Button rightBtn = (Button) findViewById(R.id.right_btn);
rightBtn.setOnClickListener(mRightListener);
rightBtn.postInvalidate();
Best Solution
The problem is that the only
Window
implementation (PhoneWindow
) uses aLayoutInflater
in itssetFeatureInt
method and instantiates the new layout withinflate
andattachToRoot=true
. Consequently, when you callsetFeatureInt
, the new layouts are not replaced but attached to the internal title container and thus drawn on top of each other.You can workaround this by using the following helper method instead of
setFeatureInt
. The helper simply removes all views from the internal title container before the new custom title feature is set:I'm not sure whether the current
setFeatureInt
behaviour is intended, but it is certainly not documented one way or the other which is why I'll take this to the android devs ;)EDIT
As pointed out in the comments, the aforementioned workaround is not ideal. Instead of relying on the
com.android.internal.R.id.title_container
constant you could simply hide the old custom title whenever you set a new one.Let's assume you have two custom title layouts:
and
and you want to replace
custom_title_1
withcustom_title_2
, you could hide former and usesetFeatureInt
to add the latter: