5

In my tablayout example, i have created 3 tabs, as usually i set 3 activities for each tab. I can set image to title bar of activity, which adds the intent to each tab. Due to this, the image in the title bar is visible in all 3 tabs. My requirement is to set a different image to title bar for each activity. I followed this to set image to title bar. But when i am going to do the same thing to each activity, getting android.util.AndroidRuntimeException: You cannot combine custom titles with other title features this error and application is terminated.

manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.aptitsolution.tablayout"
  android:versionCode="1"
  android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/MyTheme">
    <activity android:name=".TabLayoutDemo"
              android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

 <activity android:name="AlbumsActivity"></activity>

TabLayoutDemo.java

public class TabLayoutDemo extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.main);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);

    Resources res = getResources(); 
    TabHost tabHost = getTabHost(); 
    TabHost.TabSpec spec;  
    Intent intent;  

    intent = new Intent().setClass(this, ArtistsActivity.class);
    spec = tabHost.newTabSpec("artists").setIndicator("Artists",
                      res.getDrawable(R.drawable.ic_tab_artists))
                  .setContent(intent);
    tabHost.addTab(spec);
    ....
    ....

ArtistsActivity.java

public class ArtistsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);//i am getting the error here     
    setContentView(R.layout.artists);
    setFeatureDrawableResource(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);     

}

}

my_title.xml

<RelativeLayout android:id="@+id/header"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="fill_parent">
<ImageView android:src="@drawable/nowplaying"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView android:id="@+id/title" android:layout_width="wrap_content"
    android:text="New Title" android:layout_height="wrap_content"/></RelativeLayout>

thanks
venu

Community
  • 1
  • 1
Venugopal
  • 1,288
  • 3
  • 19
  • 31

3 Answers3

6

Hello You cannot use Custom Title feature from activities that are nested in TabHost.

That is if you are requesting Custom Title from Activity A and Activity B which are nested in TabActivity Android will throw the exception you mentioned above.

Work around to this issue is to let TabActivity request custom title. And change content of Custom Title of TabActivity from inside the Activity A and Activity B.

Another tip I can give you is override the onResume() call of Activity A and Activity B to change the TabActivity custom title.

EDIT : Sample Code

For your tab activity

public class TabLayoutDemo extends TabActivity {

//CREATING A PUBLIC STATIC VARIABLE
public static TabLayoutDemoInstance myTabLayoutDemo;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.main);

    TabLayoutDemo.TabLayoutDemoInstance=this;//STORING 

    //COMMENTING SET FEATURE IN TAB
    //getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);
//REST CODE REMAINS SAME

Now for your Activity A and B

public class ActivityA extends Activity{
//LOST MORE CODE ABOVE
@Override
protected void onResume() {
    super.onResume();
//SET FEATURE FROM INSIDE ACTIVITY
    TabLayoutDemo.TabLayoutDemoInstance.getWindow().
           setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);
}

}

Copy on resume of ActivityA specified above for B as well.

Tip: you can change change the title layout from each activity using this.

I hope that helps.

Shardul
  • 27,760
  • 6
  • 37
  • 35
  • @Shardul, thanks for your valuable suggestion. Actually, i am new to android and i dont know how to get title properties from my activities. If u have any examples please suggest me. – Venugopal Dec 27 '10 at 03:47
  • Sample added. Hope this sorts out everything for you. – Shardul Dec 27 '10 at 15:53
  • @Shardul, thank you very much. Your code is working very nice. – Venugopal Dec 27 '10 at 16:58
  • @Shardul, can u please tell me how can i get the reference of imageview from my_title.xml?? when i directly call findViewById() from ActivityA's onResume(), it is giving null value. – Venugopal Dec 29 '10 at 17:02
  • @Venu Gopal, I had the same problem. Your imageview is in the TabActivity, so you have to find it there: `TabLayoutDemo.myTabLayoutDemo.findViewById()`. – Konsumierer Mar 23 '11 at 12:32
  • @Shardul: I´m not sure if it´s necessary that you set the feature inside of the inner activities. For me it works fine doing so in the TabActivity. By the way, the declaration of the static variable and the access to it in ActivityA in your code seems to be wrong? – Konsumierer Mar 23 '11 at 12:34
4

The (standard) title you can change easily with

  1. implementing onChildTitleChanged in the TabActivity

    @Override 
    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
        super.onChildTitleChanged(childActivity, title);
        setTitle(title);
    }
    
  2. set the title in the child activities, f.e.

    @Override 
    protected void onResume() {
        setTitle("Calender");
        super.onResume();
    }
    

Changing a custom title shouldn't be that hard with this strategy. F.e. all your child-activities could implement a interface and have a method

    public int getTitleResource()

The tab-activity can now do

    @Override 
    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
        super.onChildTitleChanged(childActivity, title);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, ((TabChild)childActivity).getTitleResource());
    }

Or you can transport the id as part of the child-title-string and parse it back to int...

oae
  • 1,513
  • 1
  • 17
  • 23
0
--------------------------- One more Action for the same --------------------
Step Declare instance of class:
Parent Tab Activity:
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.tab_layout_title);
TabLayoutActivity.tabLayout = this;
TextView titleText = (TextView) findViewById(R.id.myTitle);
titleText.setText("Care");

Child Activity
@Override 
    protected void onResume() {
        super.onResume();
        TabLayoutActivity.tabLayout.titleText.setText("Title name");

    }
Vinod Joshi
  • 7,696
  • 1
  • 50
  • 51