如何在TabLayout中为每个活动设置图标到标题栏

时间:2010-12-26 12:36:57

标签: android

在我的tablayout示例中,我创建了3个选项卡,因为通常我为每个选项卡设置了3个活动。我可以将图像设置为活动的标题栏,这会将意图添加到每个选项卡。因此,标题栏中的图像在所有3个选项卡中都可见。我的要求是为每个活动的标题栏设置不同的图像。我按照this将图像设置为标题栏。但是,当我要对每个活动做同样的事情时,得到android.util.AndroidRuntimeException: You cannot combine custom titles with other title features此错误并终止应用程序。

的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>

感谢
VENU

3 个答案:

答案 0 :(得分:6)

您好!您无法在Custom Title嵌套的活动中使用TabHost功能。

如果您要从活动A 活动B 请求自定义标题,这些标题嵌套在 TabActivity 中,Android将抛出您提到的异常上方。

解决此问题的方法是让TabActivity请求自定义标题。并从活动A和活动B中更改TabActivity的Custom Title的内容。

我可以给你的另一个提示是覆盖活动A和活动B的onResume()调用,以更改TabActivity自定义标题。

编辑:示例代码

用于标签活动

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

现在为您的活动A和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);
}

}

复制上面为B指定的ActivityA的简历。

提示:您可以使用此更改从每个活动更改标题布局。

我希望有所帮助。

答案 1 :(得分:4)

您可以使用

轻松更改(标准)标题
  1. 在TabActivity中实现onChildTitleChanged

    @Override 
    protected void onChildTitleChanged(Activity childActivity, CharSequence title) {
        super.onChildTitleChanged(childActivity, title);
        setTitle(title);
    }
    
  2. 在子活动中设置标题,例如

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

  3. 使用此策略更改自定义标题不应该那么难。 F.E.您的所有子活动都可以实现一个接口并有一个方法

        public int getTitleResource()
    

    标签活动现在可以

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

    或者您可以将id作为child-title-string的一部分传输并将其解析回int ...

答案 2 :(得分: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");

    }