Android-android tabhost 问题
安卓的tabhost里 直接跳转的话就会脱离tab,使用如下方法可以勉强实现功能,但是有诸多问题,比如,返回按钮会有问题,有时候会找不到parent,到底如何跳转才是比较好的,没有问题的解决方案呢。
ActivityGroup pp=((ActivityGroup)((Activity)context).getParent());
LinearLayout container=(LinearLayout)(pp.findViewById(R.id.containerBody));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
container.removeAllViews();
container.addView(pp.getLocalActivityManager().startActivity(
toActivityClass.getName(),
intent)
.getDecorView());
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可以使用ActivityGroup来完成你说的功能,不过我的方式有点不一样,需要继承ActivityGroup,实现一些函数,比如onBackPressed() 针对返回键的处理,当然也可以重载其他需要的函数。在特定的tab页面里面,我一开始放一个ListActivity,当我点击某一项的时候在当前页面里面会启动一个新的activity,按返回键又可以返回到listActivity.
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;
public class Main extends TabActivity{
public TabHost tabHost;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the tabHost
this.tabHost = getTabHost();
TabHost.TabSpec spec; // 每个tab页面都可以重用的
Intent intent; // 每个tab页面都可以重用的
// 针对多个activity可以重用的tab页面,创建一个intent来启动ListViewGroup
intent = new Intent().setClass(this, ListViewGroup.class);
// 初始化第一个tab页面
spec = tabHost.newTabSpec("ListViewGroup").setIndicator("ListViewGroup",
getResources().getDrawable
(null)) // Replace null with R.drawable.your_icon to set tab icon
.setContent(intent);
tabHost.addTab(spec);
// 针对第二个tab页面,方法相同,SecondActivityGroup就不写代码了,自定义的
intent = new Intent().setClass(this, SecondActivityGroup.class);
spec = tabHost.newTabSpec("SecondGroup").setIndicator("SecondGroup",
getResources().getDrawable
(null)) // Replace null with R.drawable.your_icon to set tab icon
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
}
}
最关键的地方在于实现ActivityGroup的特定函数,这样可以重载特定行为比如满足正常返回的需求:
import java.util.ArrayList;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
public class ListViewGroup extends ActivityGroup {
public static ListViewGroup group;//一定要设置成静态,这样多个activity可以共享
private ArrayList<View> history;//保存所有的contentview
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.history = new ArrayList<View>();
group = this;
// 启动第一个activity MyListActivity
View view = getLocalActivityManager().startActivity("MyListActivity", new
Intent(this,MyListActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
//替换当前的contentview
replaceView(view);
}
public void replaceView(View v) {
// 旧的view被保存
history.add(v);
// 换上新的
setContentView(v);
}
public void back() {
if(history.size() > 0) {
history.remove(history.size()-1);
setContentView(history.get(history.size()-1));
}else {
finish();
}
}
@Override
public void onBackPressed() {
ListViewGroup.group.back();
return;
}
}
以下是只是自定义实现的listactivity,。你也可以定义任何activity
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class MyListActivity extends ListActivity{
private String[] cities = new String[] {"Rome", "Budapest", "Washington"}
private ListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
fillData();
}
public void fillData() {
ArrayAdapter citiesAdapter = new ArrayAdapter(this, R.layout.city_row, cities);
setListAdapter(citiesAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, ShowCity.class);//新启动的activity showcity
String city_name = (String) getListAdapter().getItem(position);
i.putExtra("city_name", city_name);
// 需要把新启动的activity的view替换当前的view
View view = FirstGroup.group.getLocalActivityManager()
.startActivity("show_city", i
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
// 调用上一个类的replaceView做替换操作
FirstGroup.group.replaceView(view);
}
}
提供两个方法,一个用ActivityGroup来实现同一个tab里多个不同activity;二是通过ViewFlippe实现
ActivityGroup
ViewFlippe
O(∩_∩)O哈哈哈~, 人才啊, 我跟你用的居然是同一种方法,问到点上了, 我解决了你说的问题,但是不知道这样做还有什么不足的地方没有,给提问者参考下,同时大家也多给点意见吧。
我项目效果集成 木蚂蚁电子市场
可以先去看下我实现的效果,有逻辑有些复杂所以我就只贴出代码的片段了,大家都用tabhost 去做的,我想你都懂的。。。
tabHost.addTab(tabHost.newTabSpec("mian").setIndicator(view).setContent(R.id.layout_main));
tabHost.addTab(tabHost.newTabSpec("applaction").setIndicator(view_1).setContent(
R.id.layout_applaction));
tabHost
.addTab(tabHost.newTabSpec("game").setIndicator(view_2)
.setContent(R.id.layout_game));
tabHost.addTab(tabHost.newTabSpec("serch").setIndicator(view_3).setContent(
R.id.layout_serch));
tabHost.addTab(tabHost.newTabSpec("manage").setIndicator(view_4).setContent(
R.id.layout_manage));
按上述,我的tabhost 分为 mian,applaction,game,serch,manage。
我有首页来举例:
我用一个View 的数组去保存我上述的几大页,也就是每一个activity 打开得到的视图,这样当下一次,重新进入的时候,就不用开启一个新的activity 了
if (view[0] == null) {
view[0] = getLocalActivityManager().startActivity(
"Module0",
new Intent(MenuActivityGroup.this, MainActivity.class).addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra("isConnection", isConnection))
.getDecorView();
Log.e("openHome()", " 打开一个新的 ");
}
tabHost.setCurrentTabByTag("mian"); //选中我的首页
以这样的做法,已经解决了重复打开的问题的,但是我们还需要响应系统返回键的操作的,按照我们这种架构去实现的效果 其实就只存在一个activity 默认的按一下back 俺们的程序就得退出了,这样的效果我们肯定是不能接受的, 所以我们需要自己去记录用户操作的轨迹。
例如: A → B→ C→ D→E 如果依次打开这个,然后按下back当然是DCBA 这样跳转, 但是 ABCDEAB ,你按下返回键时又应该怎么做呢 AEDCBA? 呵呵 这个要看你的需求了。 我目前的做法让A 响应back 键弹出对话框,其他界面不响应back键。 按照我们这种写法 其实ABCDE都是平级的关系。 我让tabhost 的界面响应返回键做了以这样一个操作,
String position = MyActivityTrack.getMyActivityTrack().nextTrack();//取出应该跳转到哪里
tabHost.setCurrentTabByTag(position ); //执行跳转
if(!MyActivityTrack.getMyActivityTrack().getTrack(0).equals("main")){//因为我程序在首页时才退出的,我担心由于我算法的错误导致回不到首页,所以我做了这样一个操作
MyActivityTrack.getMyActivityTrack().pushTrack(0,"main");
}
下面一个是我记录用户操纵记录, 我把他称为用户的足迹的管理类:
package com.mumayi.market.util;
import java.util.ArrayList;
import java.util.List;
public class MyActivityTrack {
private static MyActivityTrack activityTrack = null;
private static List<String> list = null;
private MyActivityTrack(){
}
public static MyActivityTrack getMyActivityTrack(){
if(activityTrack == null){
activityTrack = new MyActivityTrack();
list = new ArrayList<String>();
}
return activityTrack;
}
public int TrackSize(){
return list.size();
}
/**
* 往列表中 添加一个足迹 (当前界面的位置)
* @param track
*/
public void pushTrack(String track){
trackFilter(track);
list.add(track);
allItmes();
}
/**
* 往列表中 添加一个足迹 (当前界面的位置) 指定索引位置
* @param track
*/
public void pushTrack(int index,String track){
list.add(index,track);
allItmes();
}
/**
* 过滤相同的足迹
*/
private void trackFilter(String track){
int size = list.size();
if(size<=0)return;
for(int i = 0;i<size;i++){
String temp = list.get(i);
if(temp.equals(track)){
list.remove(i);
break;
}
}
}
/**
* 当前的位置
* @return
*/
public String currenTrack(){
int index = list.size()-1;
if(index >=0){
return list.get(index);
}
return null;
}
/**
* 取得指定 索引位置的 足迹记录
* @return
*/
public String getTrack(int index){
return list.get(index);
}
public String nextTrack(){
popTrack();
System.out.println("nextTrack = "+currenTrack());
return currenTrack();
}
/**
* 移除一个足迹
*/
private void popTrack(){
String track = currenTrack();
if(track!=null){
list.remove(track);
}
}
private void allItmes(){
for(int i = 0; i< list.size();i++){
System.out.println(i+" = "+ list.get(i));
}
System.out.println("===========");
}
}
希望能帮到你吧。