【问题标题】:Android Fragment vs. Activity GroupAndroid Fragment 与 Activity 组
【发布时间】:2012-10-12 14:12:34
【问题描述】:

我正在开发一个 Android 应用程序,我想在其中为每个选项卡实现一个活动组。但由于 Activity Group 已被弃用,我必须使用 Fragments。我在最后几天用谷歌搜索并对该主题进行了一些研究,但我仍然不明白。下图描述了我想要做的事情。另外我是直接从 iOS 来的,我需要一些关于我的理论的反馈。

正如您所见,每个 Fragment 都由一个 WebView Fragment 组成。当用户单击该 WebView 片段中的链接时 - 请求被捕获并替换一个新片段,该片段再次保存一个 WebView 并加载在前一个片段中单击的链接。在某一时刻,用户决定返回第一个 Fragment 并按下返回按钮。

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

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

我的代码结构如下所示:

我的 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 表示一个很好解释的问题。
  • 你有没有找到解决这个问题的可靠方法?

标签: android android-fragments android-tabhost activitygroup


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我同意这是次优的,但我有我的理由。虽然我想我会听从你的建议 - 它更容易。不过,我对如何为每个选项卡实现片段堆栈感兴趣。
  • 好吧,既然你问了,我敢肯定这不是一个好主意,但你可以为每个选项卡提供一个 Fragments 堆栈(或其他数据结构)。每次用户单击链接时,将片段添加到该选项卡的堆栈(出于显而易见的原因,您不希望将任何片段添加到应用程序的后台堆栈)。然后,按下返回按钮,查看当前显示的选项卡的堆栈是否为非空,如果是,则弹出下一个以显示在正确的选项卡中。
  • 也许每个标签都有一个单独的活动,然后每个活动都有自己的片段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多