【问题标题】:ABS + tabs + Fragments issueABS + 选项卡 + 片段问题
【发布时间】:2013-06-12 07:11:27
【问题描述】:

我有一个带有 ABS 和导航类型选项卡的应用程序。 在其中一个选项卡中,我有 3 个片段(不同排列的纵向/横向):一个有列表,一个有封面流,最后一个有一些搜索功能。当按下列表项或覆盖流项或搜索结果时,我打开应该作为片段全屏加载的详细信息片段。 另一个问题是,对于每个片段,我必须调用一个 web 服务来返回要显示的信息。但是我不能并行调用它们,所以我首先加载列表,然后是覆盖流,然后是搜索选项。否则,它会给出服务器错误,例如:“仍然分配连接”。

问题:配置更改后将无法按预期工作:因为我不希望根据新配置以及后台堆栈中的三个和不知何故没有服务器错误:D

我尝试过的: 1) 活动没有 configChanges 属性,因此活动每次都在重新启动。这适用于三个片段,但是当我打开一个细节时,它给了我我谈到的服务器错误。因为它试图同时从 backstack 中恢复所有 3 个片段以及详细片段。

查看 logcat 输出:

06-12 12:31:38.511:E/EvenementsMainActitity(23833):onCreate

06-12 12:31:38.551: E/NouveauLieuxFragment(23833): onCreateView

06-12 12:31:38.561: E/Top5Fragment(23833): onCreateView

06-12 12:31:38.571: E/RechercheFragment(23833): onCreateView

06-12 12:31:38.611: E/SalleDetailsFragment(23833): onCreateView

06-12 12:31:38.641:W/PhoneWindow(23833):以前聚焦的视图在保存期间报告 id 2131099775,但在恢复期间找不到。

06-12 12:31:38.641: I/EvenementsMainActitity(23833): onResumeFragments

06-12 12:31:38.671: I/EvenementsMainActitity(23833): onTabSelected - Les Tops

06-12 12:31:38.671: E/NouveauLieuxFragment(23833): onCreateView

06-12 12:31:38.681:W/SingleClientConnManager(23833):SingleClientConnManager 的使用无效:连接仍然分配。

06-12 12:31:38.681:W/SingleClientConnManager(23833):确保在分配另一个连接之前释放连接。

06-12 12:31:38.721: E/Top5Fragment(23833): onCreateView 06-12 12:31:38.731: E/RechercheFragment(23833): onCreateView

06-12 12:31:38.831: I/coverflow(23833): 中心coverflow 427

06-12 12:31:38.851: E/SalleDetailsFragment(23833): GetSalleById 错误服务器错误

06-12 12:31:38.851:W/System.err(23833):com.neurospeech.wsclient.SoapFaultException:服务器错误

  • 其中 EvenementsMainActitity 是主要活动; NouveauLieuxfragment、Top5Fragment 和 RechercheFragment 是我说的 3 个片段,而 SalleDetailsFragment 是细节片段
    • 我似乎无法理解为什么片段的oncreateview 被调用了两次:(

2) 带有活动的 configChanges 属性,所以我编写了 onConfigurationChanged 方法,但就像我所做的那样,它只是恢复了我来自的选项卡,即使我详细说明了。

3)现在我正在尝试将细节更改为活动,但这非常困难,因为我需要一堆变量,我必须通过捆绑发送它们,而且我不会有操作栏等。 .

注意:由于方向布局不同,我必须再次显示活动和片段配置更改。

让我知道我有更多信息或代码可以提供更好的理解。

编辑: 我有一个包含选项卡的 SherlockFragmentActivity,每个选项卡都有一个 SherlockFragment,细节也一样。 比我有:

private class MyTabListener implements ActionBar.TabListener {
    private final Activity mActivity;

    public MyTabListener(Activity activity, String tag) {
        mActivity = activity;
    }

    @Override
    public void onTabSelected(Tab tab, final FragmentTransaction ft) {

        ....

        tab_position = tab.getPosition();

        switch (tab_position) {
           ...
            case 1: // Les Tops

                if (BuildMode.DEBUG) {
                    Log.i(TAG, "onTabSelected - Les Tops");
                }

                preInitializedFragment1 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                        .findFragmentByTag(fragments_mTags.get(2));
                preInitializedFragment2 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                        .findFragmentByTag(fragments_mTags.get(10));
                if (!isPhone)
                    preInitializedFragment3 = (SherlockFragment) ((SherlockFragmentActivity) mActivity).getSupportFragmentManager()
                            .findFragmentByTag(fragments_mTags.get(8));

                if (preInitializedFragment1 == null && preInitializedFragment2 == null
                        && ((!isPhone && preInitializedFragment3 == null) || isPhone)) {
                    frag1 = (SherlockFragment) SherlockFragment.instantiate(mActivity, NouveauLieuxFragment.class.getName());
                    ft.add(R.id.content1, frag1, fragments_mTags.get(2));
                    frag2 = (SherlockFragment) SherlockFragment.instantiate(mActivity, Top5Fragment.class.getName());
                    ft.add(R.id.content2, frag2, fragments_mTags.get(10));
                    if (!isPhone) {
                        frag3 = (SherlockFragment) SherlockFragment.instantiate(mActivity, RechercheFragment.class.getName());
                        ft.add(R.id.content3, frag3, fragments_mTags.get(8));
                    }
                } else if (frag1 != null && frag2 != null && ((!isPhone && frag3 != null) || isPhone)) {
                    ft.attach(frag1);
                    ft.attach(frag2);
                    if (!isPhone)
                        ft.attach(frag3);
                } else if (preInitializedFragment1 != null && preInitializedFragment2 != null
                        && ((!isPhone && preInitializedFragment3 != null) || isPhone)) {
                    ft.attach(preInitializedFragment1);
                    ft.attach(preInitializedFragment2);
                    frag1 = preInitializedFragment1;
                    frag2 = preInitializedFragment2;
                    if (!isPhone) {
                        ft.attach(preInitializedFragment3);
                        frag3 = preInitializedFragment3;
                    }
                }
                loadLesTops();

                break;
            ....
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {


        ....

        // Detach the fragment, because another one is being attached
        if (frag1 != null) {
            ft.detach(frag1);
        }
        if (frag2 != null) {
            ft.detach(frag2);
        }
        if (frag3 != null) {
            ft.detach(frag3);
        }
    }
}

【问题讨论】:

  • 配置更改后将无法按预期工作 - 这不是对问题的明确解释。一些关于如何处理这些片段的代码会很好看。

标签: android tabs android-fragments actionbarsherlock


【解决方案1】:

首先我们需要一些代码来看看你是怎么做的。

在使用ABS时不要使用Activity或Fragment,必须使用SherlockFragmentActivity和SherlockFragment。

例如,您可以拥有一个包含您的 ViewPager 或选项卡的 SherlockFragmentActivity,并在每个选项卡中拥有一个 SherlockFragment。

您的 DetailView 应该是 SherlockFragmentActivity,您可以使用 Extra 传递数据,这与与 Fragment 捆绑的行为相同。可以在每个 SherlockFragmentActivity 中检索 ABS:

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.titre_abs);
bar.setDisplayHomeAsUpEnabled(true);

您通过以下方式返回 MainActivity:

@Override
public void onBackPressed() {
    finish();
    overridePendingTransition(R.animator.anim_left, R.animator.anim_right);
}

使用

管理您的 MenuItems
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    return true;
}

除非您的应用程序需要它,否则您不应让活动/片段在屏幕旋转时刷新。使用:

android:configChanges="orientation|screenSize"

fragment 之间的交换尽量不要使用“Add”,使用“Replace”。

... 你使用 TabAdapter 类吗?一个 ViewPager ?

我们需要更多代码帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2013-07-09
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多