2010-12-06 33 views
3

当我在另一个TabActivity中嵌套TabActivity时,从内部选项卡调用时,startActivityForResult失败。新的活动开始,但我收到一条错误消息:Android:嵌套选项卡活动不适用于startActivityForResult

startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent 

和onActivityResult从不会在活动返回时调用。

重现代码见下面。四班,MyActivity是两个选项卡主类,NestedTab有三个标签,所有标签containt SimpleActivity与调用SimpleDialog按钮:

public class MyActivity extends TabActivity { 
/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Populate a couple of tabs 
    TabHost tabHost = getTabHost(); // The activity TabHost 
    TabHost.TabSpec spec; // Resusable TabSpec for each tab 
    Intent intent; // Reusable Intent for each tab 

    // Create an Intent to launch an Activity for the tab (to be reused) 
    intent = new Intent().setClass(this, SimpleActivity.class); 
    // Initialize a TabSpec for each tab and add it to the TabHost 
    spec = tabHost.newTabSpec("simple").setIndicator("Simple") 
        .setContent(intent); 
    tabHost.addTab(spec); 

    // Repeat 
    intent = new Intent().setClass(this, NestedTab.class); 
    spec = tabHost.newTabSpec("nested").setIndicator("Nested tabs") 
        .setContent(intent); 
    tabHost.addTab(spec); 

} 
} 

public class NestedTab extends TabActivity { 
/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TabHost tabHost = getTabHost(); // The activity TabHost 
    TabHost.TabSpec spec; // Resusable TabSpec for each tab 
    Intent intent; // Reusable Intent for each tab 

    // Create an Intent to launch an Activity for the tab (to be reused) 
    intent = new Intent(this, SimpleActivity.class); 

    String tabs[]= {"One", "Two", "Three"}; 
    for (String s : tabs) 
    { 
     intent.putExtra("name", s); 
     spec = tabHost.newTabSpec(s).setIndicator(s).setContent(intent); 
     tabHost.addTab(spec); 
    } 


} 

public class SimpleActivity extends Activity { 
Button mBtn; 
Context mCtx; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple); 
    mCtx = this; 
    mBtn = (Button) findViewById(R.id.btn); 
    mBtn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      //To change body of implemented methods use File | Settings | File Templates. 
      startActivityForResult(new Intent(mCtx, SimpleDisplay.class), 1); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); //To change body of overridden methods use File | Settings | File Templates. 
    Toast.makeText(this, "Activity finished", Toast.LENGTH_LONG).show(); 
} 
} 


public class SimpleDisplay extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    TextView text = new TextView(this); 
    text.setText("Just hit back button"); 
    setContentView(text); 

} 
} 

无法粘贴的XML文件,但主要是相同的步骤4: http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

简单只是一个textview和一个按钮。

任何帮助表示赞赏。

+1

如果在另一个TabActivity中嵌套TabActivity,则必须重新考虑应用程序设计。 – 2010-12-06 20:36:59

+0

我们认为这是呈现我们的数据集的自然方式,并且是一种非常常见的方式。例如。 iPhone上的appstore拥有排名前25的子菜单选项,排名最高,排名靠前,收入最高。 – Bitt 2010-12-06 20:52:44

回答

3

尝试SimpleActivity.this.startActivity((Activity) view.getContext()).startActivity而不仅仅是startActivity。您从您的OnClickListener而不是从您的Activity开始触发活动,因此错误和缺少对活动onActivityResult的回调。

编辑:啊,我错过了双嵌套的位。当你在两个层次上使用TabActivity来双向嵌入TabActivity时,事情会变得很奇怪 - 查看TabActivity的源代码,看看那里发生了什么,如果你真的想要的话,你应该能够模仿它的行为。

它的长短之处在于你的onActivityResult只会传播到一个层次;如果你真的想要创建一个基于Intent的子子标签(而不是基于基于Intent的标签,并且具有普通的基于视图的子标签),你需要让父(单嵌套)标签触发Intent。要做到这一点,请尝试设置单嵌套选项卡,使其具有像startActivityAndDispatchToChild这样的方法,然后使用getParent().startActivityAndDispatchToChild来调用该方法。使用startActivityForResult方法,并在单嵌套选项卡上覆盖getActivityResult方法,使用从孩子返回的代码来确定要分派哪个孩子。使用该代码,请致电getLocalActivity().getActivity(whateverTag)以分派到适当的子活动。

但不这样做。只需让您的第二级活动使用基于视图而非基于意图的内容;如果您确实想要分离出哪些子子页面有所作为,请编写一个自定义ViewGroup类来管理每个子选项卡的内容。