2010-09-01 91 views
1

是否可以更新TabWidget图标/指示器?如果是这样,如何通过意图创建TabContent?下面感谢答案动态更新TabWidget图标?

编辑到@Bart

通用代码:

MainActivity:

public class TestActivity extends TabActivity { 

public int i; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //TabHost mTabHost = (TabHost) findViewById(android.R.id.tabhost); 

    TabHost mTabHost = getTabHost(); 

    mTabHost.addTab(mTabHost.newTabSpec("tab1").setContent(
      new Intent(this, OneActivity.class)).setIndicator("One")); 
    mTabHost.addTab(mTabHost.newTabSpec("tab2").setContent(
      new Intent(this, TwoActivity.class)).setIndicator("Two")); 

    changeTitle(0, 20); 
} 

public void changeTitle(int cnt, int i){ 
    View v = getTabWidget().getChildAt(cnt); 
    TextView tv = (TextView) v.findViewById(android.R.id.title); 
    tv.setText("One ("+i+")"); 
} 

}

OneActivity(ChildActivity):

public class OneActivity extends Activity { 
TextView tv; 
Button btn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.one); 

    tv = (TextView) findViewById(R.id.tv); 
    btn = (Button) findViewById(R.id.btn); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      int i = Integer.parseInt((String) tv.getText()); 
      i++; 
      tv.setText(""+i); 

      TestActivity parent = OneActivity.this.getParent(); 
      parent.changeTitle(0,i); 

     } 
    }); 
} 

}

我想显示在该标签的标题数量

回答

3

这是可能的,但它是一个有点棘手:

ViewGroup vg = (ViewGroup) getTabHost().getTabWidget().getChildAt(0); 
TextView tv = (TextView) vg.getChildAt(1); 

您要注意指数在调用getChildAt( )。最好的方法是始终调试和检查。

由于1.6 TabWidget有一个方法getChildTabViewAt多亏你可以跳过第一行写:

ViewGroup vg = (ViewGroup) getTabHost().getTabWidget().getChildTabViewAt(0); 




我还附上的Android SDK源代码,以显示TabWidget图标如何内置:

View tabIndicator = inflater.inflate(R.layout.tab_indicator, 
mTabWidget, // tab widget is the parent 
false); // no inflate params 

final TextView tv = (TextView) tabIndicator.findViewById(R.id.title); 
tv.setText(mLabel); 
final ImageView iconView = (ImageView) tabIndicator.findViewById(R.id.icon); 
iconView.setImageDrawable(mIcon); 

正如您所看到的,它包含一个TextView和ImageView。

+0

注意,您的“Android SDK源代码”是针对某些特定版本的ImageView的,而且代码可能改变,所以你不想依赖那个实现。 – CommonsWare 2010-09-01 14:37:26

+0

如何将OneActivity中的值传递给MainActivity(扩展TabActivity)? – 2010-09-01 14:44:15

+1

我同意使用getChildAt()可能无法在每个SDK上工作。我写到它很棘手。自从我测试它以后,它将在1.6-2.1版本中正常工作。 @Sameer Segal:您可以通过调用TabActivity mainActivity =(TabActivity)oneActivity.getParent();来从OneActivity获取对MainActivity的引用。 – bart 2010-09-02 07:04:44

0

鉴于标题的阵列和图标

for (int i = 0; i < numTabs; i++) { 
    TabSpec spec = host.newTabSpec(String.valueOf(i)); //sets tab index 
    Drawable icon = res.getDrawable(icons[i]); //sets the icon 
    // set tab text and icon 
    spec.setIndicator(titles[i], icon); //sets the title 

    host.addTab(spec); 
} 
2

尝试得到这样

ImageView v = (ImageView)tabActivity.getTabHost().getTabWidget().getChildTabViewAt(i).findViewById(android.R.id.icon); 

v.setImageDrawable(getResources().getDrawable(R.drawable.newIcon)); 
+1

请适当地格式化您的代码。谢谢! – Trufa 2011-06-14 15:34:56