在 tabhost 中重新加载一个活动
Posted
技术标签:
【中文标题】在 tabhost 中重新加载一个活动【英文标题】:Reload an activity inside tabhost 【发布时间】:2012-08-10 13:21:19 【问题描述】:我有一个 tabhost,我在那里添加了 3 个活动(每个选项卡一个活动)。
每次更改选项卡时,我都需要知道如何在活动中调用新实习生。
我为 tabhost 添加了一个侦听器。当我使用 clearAllTabs();
方法并在侦听器中再次添加所有选项卡时,应用程序崩溃了。
当我使用代码从视图中删除用户单击的特定选项卡tabHost.getTabWidget().removeView(tabHost.getTabWidget().getChildTabViewAt(i));
tabHost.addTab(the tab I want to replace);
然后新标签位于标签主机的末尾。
我只需要一个示例,说明每次用户单击特定选项卡时如何重新加载相应的活动。
我的代码:
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// ActionBar bar = getSupportActionBar();
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Resources res = getResources();
LocalActivityManager mlam = new LocalActivityManager(this, false);
final TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
mlam.dispatchCreate(savedInstanceState);
tabHost.setup(mlam);
TabHost.TabSpec spec;
Intent intent;
// TabHost tabHost = getTabHost();
// tabHost.setup();
TabSpec specAll = tabHost.newTabSpec("All");
specAll.setIndicator("All");
Intent allIntent = new Intent(this, allActivity.class);
specAll.setContent(allIntent);
// specAll.setContent(R.id.allList);
Log.d("SpecAll",""+specAll.setContent(allIntent));
TabSpec specIn = tabHost.newTabSpec("in");
specIn.setIndicator("In");
Intent inIntent = new Intent(this, inActivity.class);
specIn.setContent(inIntent);
TabSpec specOut = tabHost.newTabSpec("Out");
specOut.setIndicator("Out");
Intent outIntent = new Intent(this, outActivity.class);
specOut.setContent(outIntent);
// Adding all TabSpec to TabHost
tabHost.addTab(specAll); // Adding all tab
tabHost.addTab(specIn); // Adding in tab
tabHost.addTab(specOut); // Adding out tab
tabHost.setOnTabChangedListener(new OnTabChangeListener()
@Override
public void onTabChanged(String tabId)
int i = tabHost.getCurrentTab();
//Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i);
if (i == 0)
Log.d("TAB","" +i);
else if (i == 1)
Log.d("TAB","" +i);
else
Log.d("TAB", ""+i);
);
【问题讨论】:
我也遇到了这个问题,但略有不同:我想在一个标签中替换活动。我没有找到解决方案,而是保存所有选项卡内容,关闭 TabActivity,立即重新打开它并恢复内容。我确信有更好的解决方案。 我发布了解决方案伙伴。欢呼 【参考方案1】:在我不需要保留选项卡片段的简单情况下,我使用下一个代码
int currentTabId = mTabHost.getCurrentTab();
mTabHost.clearAllTabs();
setupTabs();
mTabHost.setCurrentTab(currentTabId);
【讨论】:
你节省了我的时间......爱你 【参考方案2】:我也面临同样的问题,但我是这样解决这个问题的......
这是我的 TabActivity....
public class MainActivity extends TabActivity
TabHost tabhost;
String cTab = "0";
String nTab;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
tabhost = getTabHost();
TabSpec one = tabhost.newTabSpec("0");
// setting Title and Icon for the Tab
one.setIndicator("", getResources().getDrawable(R.drawable.ic_launcher));
Intent songsIntent = new Intent(this, FirstActivity.class);
one.setContent(songsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
one.setContent(songsIntent);
TabSpec two = tabhost.newTabSpec("1");
// setting Title and Icon for the Tab
two.setIndicator("", getResources().getDrawable(R.drawable.ic_launcher));
Intent songsIntent1 = new Intent(this, SecondActivity.class);
two.setContent(songsIntent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
two.setContent(songsIntent1);
TabSpec three = tabhost.newTabSpec("2");
// setting Title and Icon for the Tab
three.setIndicator("",
getResources().getDrawable(R.drawable.ic_launcher));
Intent songsIntent4 = new Intent(this, ThirdActivity.class);
three.setContent(songsIntent4.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
three.setContent(songsIntent4);
TabSpec four = tabhost.newTabSpec("3");
// setting Title and Icon for the Tab
four.setIndicator("", getResources()
.getDrawable(R.drawable.ic_launcher));
Intent songsIntent5 = new Intent(this, FourthActivity.class);
four.setContent(songsIntent5.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
four.setContent(songsIntent5);
tabhost.addTab(one);
tabhost.addTab(two);
tabhost.addTab(three);
tabhost.addTab(four);
tabhost.setOnTabChangedListener(new OnTabChangeListener()
@Override
public void onTabChanged(String arg0)
cTab = "" + tabhost.getCurrentTab();
);
int numberOfTabs = tabhost.getTabWidget().getChildCount();
for (int t = 0; t < numberOfTabs; t++)
tabhost.getTabWidget().getChildAt(t)
.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
if (event.getAction() == MotionEvent.ACTION_UP)
String currentSelectedTag = MainActivity.this
.getTabHost().getCurrentTabTag();
nTab = currentSelectedTag;
System.out.println(" nTab " + nTab);
System.out.println(" cTab " + cTab);
if (cTab.equals(nTab))
if (nTab.equals("0"))
Intent intent = new Intent();
intent.setAction("com.ensis.first");
MainActivity.this.sendBroadcast(intent);
if (nTab.equals("1"))
Intent intent = new Intent();
intent.setAction("com.ensis.second");
MainActivity.this.sendBroadcast(intent);
if (nTab.equals("2"))
Intent intent = new Intent();
intent.setAction("com.ensis.third");
MainActivity.this.sendBroadcast(intent);
if (nTab.equals("3"))
Intent intent = new Intent();
intent.setAction("com.ensis.fourth");
MainActivity.this.sendBroadcast(intent);
return false;
);
@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);
return true;
这是我的 FirstActivity.java
public class FirstActivity extends ActivityGroup
@Override
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
ok();
IntentFilter filter = new IntentFilter("com.ensis.first");
registerReceiver(myReceiver, filter);
/**/
private void ok()
// TODO Auto-generated method stub
setContentView(R.layout.firstscreen);
Button bt=(Button)findViewById(R.id.button1);
bt.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
Intent it=new Intent(FirstActivity.this,SubActivity.class);
replaceContentView("activity3", it);
);
public void replaceContentView(String id, Intent newIntent)
View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
this.setContentView(view);
private BroadcastReceiver myReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
Log.v("22222222222222222", "22222222222");
ok();
;
【讨论】:
【参考方案3】:似乎activity和tabhost有问题。为了重新加载你只需要做的活动:
specAll.setContent(yourIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
就在 tabHost.addTab 之前
【讨论】:
以上是关于在 tabhost 中重新加载一个活动的主要内容,如果未能解决你的问题,请参考以下文章
Android 实现分页(使用TabWidget/TabHost)
当我在eclipse中单击按钮时,使用tabHost并转到特定选项卡