【问题标题】:Android. How to change Activity within a Tab安卓。如何更改选项卡内的活动
【发布时间】:2010-10-06 10:47:42
【问题描述】:

以下情况: 我有 TabActivity 例如三个选项卡,TabA、TabB、TabC。

TabC 的活动(Act_C_1)中有一个按钮。因此,如果用户单击该按钮,TabC 中应该会发生另一个活动(Act_C_2)。

提前感谢您的任何建议/或想法。

穆尔

UPD:

这是我的代码

具有三个活动的TabActivity:

public class TabScreen extends TabActivity
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.tab_menu);

        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, SecondActivity.class);

        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("tab_1").setIndicator("Tab1",null).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, ThirdActivity.class);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("tab_2").setIndicator("Tab2",null).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, FourthActivity.class);
        spec = tabHost.newTabSpec("tab_3").setIndicator("Tab3",null).setContent(intent);
        tabHost.addTab(spec);
    }

}

活动“Act_C_1”或FourthActivity.java:

public class FourthActivity extends Activity implements OnClickListener
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fourth);

        Button BtnWeiter = (Button)findViewById(R.id.BtnWeiter);
        BtnWeiter.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) 
    {                    
        // I also tried to use LocalActivityManager
        // TabActivity parentTabActivity = (TabActivity) getParent();            
        // LocalActivityManager manager = parentTabActivity.getLocalActivityManager();
        // manager.destroyActivity("tab_3", true);
        // manager.startActivity("tab_3", new Intent(this, FourthActivity.class));
        finish();
        startActivity(new Intent(this, FourthActivity.class));            
    }        
}

【问题讨论】:

标签: android android-tabhost tabactivity


【解决方案1】:

选项卡中的活动可以通过以下方式切换。

首先让我们了解一下流程:

  1. 我们在 Tab host 中有一个活动(例如一个列表),我们需要从中转到同一选项卡下的下一个活动(例如单击项目的详细信息)。为此,我们可以使用替换活动的概念。还可以为选定的选项卡设置标志,以及其他了解正在显示的详细信息

  2. 1234563此外,如果显示详细信息的标志为真,我们将进入同一选项卡中的列表,否则我们将进入 tabwidget 之前的活动(正常使用 onBackPressed)

代码可以如下..

  1. 从列表到详细信息...

(这可以在onClickListener中)

private OnClickListener textListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Constants.SHOW_DETAILS = true;
        Intent intent = new Intent(context, DetailsActivity.class);
        replaceContentView("activity3", intent);
        }
};

public void replaceContentView(String id, Intent newIntent) {
    View view = ((ActivityGroup) context)
            .getLocalActivityManager()
            .startActivity(id,
                    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
            .getDecorView();
    ((Activity) context).setContentView(view);

}
  1. 完成后按后,我们会在选项卡下的每个 Activity 中覆盖 BackPressed,以便从详细信息屏幕再次转到列表

    @Override
      public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    if (MathHelper.SHOW_DETAILS) {
        Log.e("back", "pressed accepted");
        Constants.LIST_ACTIVITY = 1;
        Constants.SHOW_DETAILS = false;
        Intent intent = new Intent(this, Tab_widget.class);
        startActivity(intent);
        finish();
      }
     }
    

这里最重要的部分是 常量.LIST_ACTIVITY = 1;它指示我们在哪个选项卡中。因此相应的活动将其值为 0,1,2...等

再次在标签活动刷新时加载正确的列表(Activty),我们必须在创建标签后将其包含在 TabWidget onCreate 中

tabHost.setCurrentTab(Constants.LIST_ACTIVITY);

【讨论】:

  • +1,只是一个通知——上面的'context'是指包含的活动,而不是容器(TabActivity)。哦,我确实想知道为什么不遵循 Android 意图设计并改用 Constants.LIST_ACTIVITY..
  • 你更正上下文是指包含选项卡的包含活动。
  • 我不同意,上下文 TabActivity,否则你不能将它转换为ActivityGroup。
  • 不能再编辑了,抱歉。使用 (ActivityGroup((Activity) 上下文).getParent()).getLocalActivityManager()
  • 嘿Bicou,实际上我在选项卡下有4个活动,每个活动都不是通过活动扩展,而是扩展了ActivityGroup。所以上下文是针对内部活动而不是 TabActivity。我们再次用新的(Here of DetailsActivity.class)替换内部活动的视图。所以这再次表明它不可能是 TabActivity。再次上下文是指内部活动的上下文,因此无需编辑它并由 (Activity) then (ActvityGroup) 转换。只有后一种就足够了。
【解决方案2】:

只需使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志来替换必要选项卡的活动。

intent = new Intent().setClass(this, YourActivity.class);
spec   = tabHost.newTabSpec("tab1").setIndicator("Tab1",null)
        .setContent(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
tabHost.addTab(spec);

【讨论】:

    【解决方案3】:

    只需为所有标签添加这个:

    yourTabHost.getChildAt(0).setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            getTabHost().setCurrentTab(0);
        }
    });
    

    【讨论】:

      【解决方案4】:

      处理按钮的onClick事件

      finish() 活动 添加 startActivity 方法来启动另一个活动。

      谢谢

      【讨论】:

      • 不错的建议,但 TabActivity 不起作用……至少我不起作用。
      • 我包含了我的代码的重要部分。 “不起作用”是不对的,但如果我这样做,选项卡活动将完成。我想要的是,只有 tabactivity 中的一个活动将完成,而另一个活动将在 tab 中开始。
      • 嗯..我不反对你的应用程序设计......据我所知,如果你想达到同样的效果......使用看起来像标签的按钮,然后你就会有完全控制您应该开始或完成的活动。选项卡的工作方式只有在您尝试从显示在选项卡内的活动中调用新活动时,新活动将占据整个屏幕,甚至选项卡也是如此。
      • 看起来这只是结束一项活动并开始一项新活动,这不是目标。请参阅上面的建议。
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多