5

我目前在一个 Android 项目中,我们的主视图是一个 TabActivity,每个选项卡都是一个单独的 Activity。一个是MapActivity,另外两个是普通的Activity。

首先请注意,我认为我们必须将每个选项卡作为单独的活动,因为单独的活动中有太多代码,无法让 TabHost 在选项卡更改时切换内容视图并将所有代码放在同一个类中。无论如何,回到问题。

其中一个选项卡包括一个按钮,当按下该按钮时,应使 TabActivity 切换到 MapActivity 并将地图动画化到特定位置。

http://joshclemm.com/blog/?p=86上的教程显示了如果 TabHost 包含地图视图和列表视图时如何执行此操作。如果单击 ListView 中的项目,TabHost 将切换到地图视图并动画到该位置(那些坐标)。这正是按下单独活动中的按钮时我需要做的事情。

MainView.java 创建如下:

public class MainView extends TabActivity implements OnTabChangeListener{
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

intent = new Intent().setClass(this, MapGUI.class);
    spec = tabHost.newTabSpec("map").setIndicator("Map",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, MissionView.class);
    spec = tabHost.newTabSpec("mission").setIndicator("Mission",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SIPView.class);
    spec = tabHost.newTabSpec("call").setIndicator("Call",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

MissionView.java 如下:

public class MissionView extends Activity implements Observer{

MissionController mc;
private TextView missionheader, missiondescription, missionaddress, 
missiontime, missioninjuries;
private Button changedesc, gotoadress;
private String[] mission;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.missiontablayout);
    missionheader = (TextView)findViewById(R.id.missionheader2);
    missiondescription = (TextView)findViewById(R.id.missiondescription2);
    missionaddress = (TextView)findViewById(R.id.missionaddress2);
    missiontime = (TextView)findViewById(R.id.missiontime2);
    missioninjuries = (TextView)findViewById(R.id.missioninjuries2);

    changedesc = (Button)findViewById(R.id.gotoaddress);
    changedesc.setOnClickListener(new OnClickListener() {           
        public void onClick(View v) {
         // DO SOMETHING HERE?              
        }
    }); 
    mc = new MissionController(MissionView.this);
}

public void update(Observable observable, Object data) {
    if(data instanceof String[]){
        mission = (String[]) data;
        updateView(mission);
    }
}
public void updateView(String[] missiontext){
    missionheader.setText(missiontext[0]);
    missiondescription.setText(missiontext[1]);
    missionaddress.setText(missiontext[2]);
    missiontime.setText(missiontext[3]);
    missioninjuries.setText(missiontext[4]);
}

}

有谁知道我怎么能做到这一点?

请注意,上面提供的代码没有实际绘制到实际位置的实现,但问题仍然存在,如何在一个活动中按下按钮来切换 TabHost 中的选项卡并触发该选项卡活动的更改?

4

2 回答 2

0

将下面的行放在按钮单击要切换到 Map 活动的位置

((MainView) getParent()).setTabMap();

并在 MainView 创建以下函数

public void setTabMap()
{
   //as Map activity is your first tab so pass 0 as index
   getTabHost().setCurrentTab(0);
}
于 2014-12-10T18:25:33.540 回答
0

使用http://developer.android.com/reference/android/widget/TabHost.html#setCurrentTab(int)TabHost可以轻松更改 a 中的选项卡setCurrentTab(int)

向其他活动发送事件可以简单地通过发送广播意图并在其他活动中接收/处理来实现Activity

或者,您可以保存对所有选项卡活动(丑陋...)的静态引用并直接调用方法。

于 2012-03-06T14:30:39.763 回答