在首选项标题中使用Android支持片段

时间:2013-04-26 18:28:00

标签: android android-fragments actionbarsherlock android-support-library

我的应用支持Android版本高达Android 2.2,这就是为什么我一般使用支持Fragments(即SherlockFragments)。

我的偏好设置是在API>时使用标头。 11和较低的传统喜好。现在我已经实现了一个(支持)Fragment,其逻辑只能用首选项复制。在较旧的Android版本上,它将在简单的SherlockFragmentActivity内启动,但在较新的版本上,它应该从标题中启动。

这是问题:标头期望本机片段。这就是为什么在新版本的首选项崩溃。是否有可能绕过这种限制?

我正在考虑以下可能性:

  • 将支持片段包裹在本机片段中。我能这样做吗?如果是,怎么样?
  • 从标题中捕获click事件,并在较新版本上自行启动片段。除了标题之外,我可以添加简单的首选项吗?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

我创建了一个包裹我的SherlockFragment的本地Fragment

public class HelperFragment extends ListFragment {
    MyFragment cp;

    public HelperFragment() {
        cp = new MyFragment();
    }
}

需要转发onCreateView()等被覆盖的来电,但有些需要特殊处理。而不是getActivity()中的MyFragment我使用了以下构造:

private Activity activity;

@Override
public void onAttach(final Activity activity) {
    this.activity = activity;
    super.onAttach(activity);
}

@Override
public void onDetach() {
    super.onDetach();
    activity = null;
}

public void setActivity(final Activity activity) {
    this.activity = activity;
}

HelperFragment在附加和分离时调用setter,如果MyFragment以常规方式附加,则它会照常工作。

在我的情况下,HelperFragment也是ListFragment,因此需要重定向对getListView()的调用。我通过覆盖getListView()中的MyFragment来解决这个问题:

private ListView listView;
@Override
public ListView getListView() {
    if (listView != null) {
        return listView;
    } else {
        return super.getListView();
    }
}

public void setListView(final ListView listView) {
    this.listView = listView;
}

并在setListView()的{​​{1}}方法中调用HelperFragment。根据使用情况,还有其他方法需要特殊处理,但概念应该清楚。