Android Fragment vs. Activity Group

时间:2012-10-22 17:58:24

标签: android android-fragments android-tabhost activitygroup

嘿伙计们我正在开发Android应用程序,我希望为每个选项卡实现一个活动组。但是由于不推荐使用Activity Group,我必须使用Fragments。我搜索了最后几天并对该主题进行了一些研究,但我仍然没有得到它。下图描述了我想要做的事情。我也是直接来自iOS,我需要一些关于我的理论的反馈。

enter image description here

正如您所看到的,每个Fragment都包含一个WebView片段。当用户单击该WebView片段中的链接时 - 请求被捕获并且替换了新的片段,该片段再次保存WebView并加载在前一片段中单击的链接。用户决定返回第一个片段并按下后退按钮。

片段应以相反的顺序从堆栈中弹出,直到他再次看到第一个片段。理想情况下,每个Fragment应该保存他的instancestate,这样当用户返回时,WebView不需要再次加载该站点。

我遇到了ActionBar Sherlock,它提供了一个关于Fragments选项卡的示例。还有片段堆栈的示例。将这两个示例结合起来是理想的,这样每个选项卡都包含一个片段堆栈。

我的代码结构如下所示:

我的TabHost片段

public class MyActivity extends SherlockFragmentActivity {
static TabHost mTabHost;
static TabManager mTabManager;

public static int THEME = R.style.Theme_Sherlock_Light;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(THEME); //Used for theme switching in samples
    super.onCreate(savedInstanceState);

    setContentView(R.layout.fragment_tabs);
    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();
    mTabManager = new TabManager(this, mTabHost, R.id.myRealTabContent);

    // adding some Fragment Tabs
    mTabManager.addTab(mTabHost.newTabSpec(tabNames[i]).setIndicator(tabNames[i]),
                FragmentStackSupport.CountingFragment.class, bundle);


    if (savedInstanceState != null) {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("tab", mTabHost.getCurrentTabTag());
}



// defining the Tab Manager

每个标签的片段堆栈应该如何? 目前我有一个片段活动,每个标签内都有一个片段。但我没有达到我需要的逻辑。

这是我的代码:My Fragment with WebView inside

我会很高兴收到一些反馈和提示(或者网上有没有例子?)。我也对内存有一些担忧 - 当用户点击并点击并点击时,内存必须将每个片段保存在堆栈中。

干杯。

1 个答案:

答案 0 :(得分:1)

每次用户点击链接时,我都无法想到创建新片段的很多理由。你有没有理由这样做?如果您只是从shouldOverrideUrlLoading()返回false而不是创建新片段,则WebView将加载新页面,如果您想返回,则可以使用canGoBack()和goBack()方法。要处理后退按钮,您可以在活动中覆盖onKeyDown,并执行以下操作:

    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack() {
        myWebView.goBack();
        return true;
    }