【问题标题】:Start activity in a Fragment在片段中开始活动
【发布时间】:2012-04-28 16:50:15
【问题描述】:

我决定通过使用新的 Fragments API 创建双窗格布局,为我的应用添加更适合平板电脑的 UI。但问题是我的应用程序中的许多屏幕都是 Activity 子类。手动将它们全部转换为片段不是一种选择,因为:
- 有近 50 项活动。
- 我希望我的应用能够兼容从 1.6 开始的所有 Android 版本
- 我希望它尽可能小,所以使用兼容性库不是一种选择,因为它太大了

虽然我发现 some questions 的答案是不可能的,但我几乎成功地做到了。这是我的自定义片段的代码:

public static class ActivityFragment extends Fragment{
    Intent intent;
    View view;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if(intent==null){
            Bundle a=getArguments();
            intent=a.getParcelable("intent");
        }
        LocalActivityManager am=((ActivityGroup)getActivity()).getLocalActivityManager();
        Window wnd=am.startActivity("intent"+intent.hashCode(), intent);
        if(view==null){
            view=wnd.getDecorView();
            view.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
        }
        return view;
    }

    public void onDestroy(){
        super.onDestroy();
        if(!((TabletMainActivity)getActivity()).tabs.containsValue(this)){
            ((ActivityGroup)getActivity()).getLocalActivityManager().destroyActivity("intent"+intent.hashCode(), true);
        }
    }
}

为了工作,它只能在 ActivityGroup 中使用。 唯一的问题是,在某些具有 ListView 方法的活动中,onItemClick() 在活动恢复后不会被调用,即我单击一个项目,另一个活动从当前开始,但是当我返回时,项目不再可单击。

【问题讨论】:

  • 如果没有兼容性库,您将无法使用 Fragment,这只会给您的 apk 添加 ~110kb。
  • 我直接使用它们并且只在 Honeycomb 上启用。
  • 这意味着您必须为所有应用作片段的部分创建活动的 ActivityFragments - 这也会增加您的 apk 大小,我看不到使用支持库的好处。
  • 不,正如您从代码中看到的那样,我正在动态创建它们,并将 Intent 作为参数传递。
  • 您不能在不知道 Fragment 是什么的设备上使用 extends Fragment 的类。一旦你尝试将该类加载到内存中,你就会得到一个 ClassNotFoundException。评估意图的部分是在那之后。

标签: java android android-fragments android-activity


【解决方案1】:

通过比较onResume前后所有ListView的字段值,我终于找到了解决方案。而解决这个问题的方法是调用列表适配器上的notifyDataSetInvalidated()方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多