如何在应用程序中维护片段的状态

ile

在FragmentTabHost中显示片段时如何保持其状态?

感谢本教程,我能够FragmentTabHost在我的应用程序中实现

我的意图是创建一个应用程序,其主要活动包含一些选项卡(该选项卡位于整个应用程序的顶部)。单击每个选项卡将在选项卡下方打开一个新片段。

问题是,当我单击某个选项卡执行某项操作,然后转到另一个选项卡时,该选项卡将打开一个新片段,然后返回到第一个选项卡-我的更改未保存。

流:

在此处输入图片说明

我确实需要实现此逻辑。如果我的方法有误,请提出替代方案。

谢谢

码:

主要活动

public class FagTabHostMain extends FragmentActivity {
    FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fag_tab_host_main);

        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

        mTabHost.addTab(mTabHost.newTabSpec("audio").setIndicator("Audio"),
                AudioContainerFragmentClass.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("video").setIndicator("Video"),
                VideoContainerFragmentClass.class, null);

    }

    @Override
    public void onBackPressed() {
        boolean isPopFragment = false;
        String currentTabTag = mTabHost.getCurrentTabTag();
        if (currentTabTag.equals("audio")) {
            isPopFragment = ((AudioContainerFragmentClass) getSupportFragmentManager()
                    .findFragmentByTag("audio")).popFragment();
        } else if (currentTabTag.equals("video")) {
            isPopFragment = ((VideoContainerFragmentClass) getSupportFragmentManager()
                    .findFragmentByTag("video")).popFragment();
        }
        // Finish when no more fragments to show in back stack
        finish();
    }
}

主要活动布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <!-- Not Using this one right now -->
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dip"
            android:layout_height="0dip"
            android:layout_weight="0" />

    </android.support.v4.app.FragmentTabHost>

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />

</LinearLayout>

AudioContainerFragmentClass

public class AudioContainerFragmentClass extends Fragment implements
        OnClickListener {

    final String TAG = "AudioContainerFragmentClass";
    private Boolean mIsViewInitiated = false;
    private boolean addToBackStack = true;
    private Button bNextFragment;
    private LinearLayout linearLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        try {
            Log.e("AudioContainerFragmentClass", "onCreateView called");
            linearLayout = (LinearLayout) inflater.inflate(
                    R.layout.audio_fragment_container, container, false);
        } catch (Exception e) {
            printException(e.toString());
        }
        return linearLayout;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        try {
            super.onActivityCreated(savedInstanceState);
            Log.e("AudioContainerFragmentClass", "onActivityCreated called");
            if (!mIsViewInitiated) {
                mIsViewInitiated = true;
                initView();
            }
        } catch (Exception e) {
            printException(e.toString());
        }
    }

    private void initView() {
        try {
            Log.e("AudioContainerFragmentClass", "initView called");
            bNextFragment = (Button) linearLayout
                    .findViewById(R.id.bNextFragment);
            bNextFragment.setOnClickListener(this);
            replaceFragment(new AudioFragment(), false);
        } catch (Exception e) {
            printException(e.toString());
        }
    }

    private void replaceFragment(AudioFragment audioFragment, boolean b) {
        try {
            FragmentTransaction ft = getChildFragmentManager()
                    .beginTransaction();
            if (addToBackStack) {
                ft.addToBackStack(null);
            }
            ft.replace(R.id.audio_sub_fragment, audioFragment);
            ft.commit();
            getChildFragmentManager().executePendingTransactions();
        } catch (Exception e) {
            printException(e.toString());
        }
    }

    // Called from FagTabHostMain Activity
    public boolean popFragment() {
        boolean isPop = false;
        try {
            Log.e("AudioContainerFragmentClass", "popFragment called");
            if (getChildFragmentManager().getBackStackEntryCount() > 0) {
                isPop = true;
                getChildFragmentManager().popBackStack();
            }
        } catch (Exception e) {
            printException(e.toString());
        }
        return isPop;
    }

    @Override
    public void onClick(View arg0) {
        TextView tv  = (TextView)getActivity().findViewById(R.id.tvaudioTitle);
        tv.setText("Text changed");
    }

    private void printException(String string) {
        Log.e("__ERRORR__", string);
    }
}

音频片段

public class AudioFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.audio_sub_fragment, container,
                false);
        return view;
    }
}
肖恩

在我的应用中有同样的事情。您将需要将FragmentTabHost复制到您的项目,将您的代码指向使用新的自定义FragmentTabHost,然后将的代码更改doTabChanged为以下实现:

    private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
    TabInfo newTab = null;
    for (int i=0; i<mTabs.size(); i++) {
        TabInfo tab = mTabs.get(i);
        if (tab.tag.equals(tabId)) {
            newTab = tab;
        }
    }
    if (newTab == null) {
        throw new IllegalStateException("No tab known for tag " + tabId);
    }
    if (mLastTab != newTab) {
        if (ft == null) {
            ft = mFragmentManager.beginTransaction();
        }
        if (mLastTab != null) {
            if (mLastTab.fragment != null) {
                ft.hide(mLastTab.fragment);
            }
        }
        if (newTab != null) {
            if (newTab.fragment == null) {
                newTab.fragment = Fragment.instantiate(mContext,
                        newTab.clss.getName(), newTab.args);
                ft.add(mContainerId, newTab.fragment, newTab.tag);
                findViewById(mContainerId).setContentDescription("DEBUG. add fragment to this container");
            } else {
                if (newTab.fragment.isHidden()){
                    ft.show(newTab.fragment);
                }
                else{
                    ft.attach(newTab.fragment); 
                }
            }
        }

        mPreviousTab = mLastTab;
        mLastTab = newTab;
    }
    return ft;
}

所做的更改是deattach/attach,我们正在做片段而不是片段hide/show

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在我的iPhone应用程序中维护会话状态

来自分类Dev

维护JavaEE应用程序中的对象状态

来自分类Dev

如何在Backstack中具有嵌入式片段的Activity之间保存应用程序状态?

来自分类Dev

如何在AJAX调用中查询应用程序状态?

来自分类Dev

如何在Android应用程序的后台维护服务

来自分类Dev

如何在两个窗口之间的Wpf应用程序中维护会话?

来自分类Dev

如何在核心Java应用程序中维护会话超时?

来自分类Dev

如何在整个应用程序中维护请求队列的单个实例

来自分类Dev

如何在整个应用程序的KnockoutJs中维护全局变量?

来自分类Dev

如何在角度应用程序中实现维护页面的自动更新?

来自分类Dev

Spring Rest Docs如何在代码片段或.adoc文件中包含应用程序名称

来自分类Dev

使用模板10维护UWP应用程序中的用户控制状态

来自分类Dev

如何在Web应用程序(Spring / Vaadin)中为每个用户创建和维护一个jdbc连接?

来自分类Dev

如何从片段重新启动Android中的应用程序

来自分类Dev

如何在Windows Phone 7和8中获取应用程序状态事件?

来自分类Dev

如何在AngularJS单页应用程序中返回http状态代码?

来自分类Dev

如何在OS X Yosemite中开发状态栏应用程序?

来自分类Dev

如何在我的Web应用程序中公开Amazon Lambda函数的状态?

来自分类Dev

如何在Spark Streaming应用程序中初始化DStream的状态

来自分类Dev

如何在带有图标的应用程序中显示电池状态?

来自分类Dev

如何在带有商店的Flux / ReactJS应用程序中管理状态?

来自分类Dev

如何在Android应用程序中检查Facebook登录状态?

来自分类Dev

如何在React应用程序中更新谷歌地图API输入字段的状态

来自分类Dev

如何在Flink有状态功能应用程序中创建自动保存点?

来自分类Dev

如何在R Shiny应用程序中存储反应变量的先前状态?

来自分类Dev

如何在Android应用程序(Android Studio 4.1)中隐藏状态栏

来自分类Dev

如何在状态栏中添加自定义应用程序?

来自分类Dev

如何在带有图标的应用程序中显示电池状态?

来自分类Dev

如何在Tizen本机应用程序中隐藏状态栏

Related 相关文章

  1. 1

    在我的iPhone应用程序中维护会话状态

  2. 2

    维护JavaEE应用程序中的对象状态

  3. 3

    如何在Backstack中具有嵌入式片段的Activity之间保存应用程序状态?

  4. 4

    如何在AJAX调用中查询应用程序状态?

  5. 5

    如何在Android应用程序的后台维护服务

  6. 6

    如何在两个窗口之间的Wpf应用程序中维护会话?

  7. 7

    如何在核心Java应用程序中维护会话超时?

  8. 8

    如何在整个应用程序中维护请求队列的单个实例

  9. 9

    如何在整个应用程序的KnockoutJs中维护全局变量?

  10. 10

    如何在角度应用程序中实现维护页面的自动更新?

  11. 11

    Spring Rest Docs如何在代码片段或.adoc文件中包含应用程序名称

  12. 12

    使用模板10维护UWP应用程序中的用户控制状态

  13. 13

    如何在Web应用程序(Spring / Vaadin)中为每个用户创建和维护一个jdbc连接?

  14. 14

    如何从片段重新启动Android中的应用程序

  15. 15

    如何在Windows Phone 7和8中获取应用程序状态事件?

  16. 16

    如何在AngularJS单页应用程序中返回http状态代码?

  17. 17

    如何在OS X Yosemite中开发状态栏应用程序?

  18. 18

    如何在我的Web应用程序中公开Amazon Lambda函数的状态?

  19. 19

    如何在Spark Streaming应用程序中初始化DStream的状态

  20. 20

    如何在带有图标的应用程序中显示电池状态?

  21. 21

    如何在带有商店的Flux / ReactJS应用程序中管理状态?

  22. 22

    如何在Android应用程序中检查Facebook登录状态?

  23. 23

    如何在React应用程序中更新谷歌地图API输入字段的状态

  24. 24

    如何在Flink有状态功能应用程序中创建自动保存点?

  25. 25

    如何在R Shiny应用程序中存储反应变量的先前状态?

  26. 26

    如何在Android应用程序(Android Studio 4.1)中隐藏状态栏

  27. 27

    如何在状态栏中添加自定义应用程序?

  28. 28

    如何在带有图标的应用程序中显示电池状态?

  29. 29

    如何在Tizen本机应用程序中隐藏状态栏

热门标签

归档