【问题标题】:Fragment Navigation Inside a Tabbed Action Bar选项卡式操作栏中的片段导航
【发布时间】:2012-06-26 17:21:31
【问题描述】:

问题

在描述我当前的设置之前,我将描述我的问题。我需要在单独的选项卡内的片段之间进行分层导航。假设我在选项卡中向下钻取,然后切换选项卡,然后返回到第一个原始选项卡,我需要它位于向下钻取的级别,然后能够返回到顶层标签。

现在开始我的设置。

我有一个应用程序,其中包含一个名为 MainActivity 的活动。此活动是控制我的选项卡式操作栏的内容。我遵循了许多不同的教程来处理选择选项卡时片段的切换,下面的代码可以引起您对onTabSelectedonTabUnselected 方法的注意。

MainActivity -- 选项卡监听器

public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener {
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private Fragment mFragment;

    public MyTabListener(Activity activity, String tag, Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Log.e("FRAGMENT","Selected Fragment With Tag " + mTag);
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
    }


}

当我在 Tab1 查看 Fragment1', when a button is pressed I then show anotherFragmentcalledFragment2` 时,我需要能够返回。如果我只停留在该选项卡上,下面的代码就可以工作,但是当我离开该选项卡并返回它时,一切都搞砸了。

MainActivity -- 显示第二个片段

Fragment tdFrag = Fragment.instantiate(this, SecondFragment.class.getName());
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(android.R.id.content, tdFrag, "secondfrag");
    ft.addToBackStack(null);
    ft.commit();

我的想法

我认为这一定是我分离片段并在按下新标签时处理切换的方式。也许我需要实现某种方式来存储每个选项卡的每个单独的后台堆栈并从中加载片段而不是系统后台堆栈?

任何帮助都会很棒。我试图尽可能彻底和简单地解释它。

提前致谢。

【问题讨论】:

    标签: android android-fragments android-tabs


    【解决方案1】:

    好的,经过一些实验后,我决定使用枚举类型来实现自定义 backstack。

    我有两种枚举类型:ViewTypeCurrentTab 类型。 CurrentTab 类型告诉我当前正在查看的选项卡,ViewType 告诉我正在这些选项卡中查看的视图。对于每个标签,我都有一个ViewType 的实例,我必须存储我在层次结构中的位置。

    为了实现一个返回栈,我重写了按下返回按钮时调用的方法。

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
    
                 return true;
            }
         return super.onKeyDone(keyCode,event);
    }
    

    因此,在它检查后退按钮的位置,我将代码用于检查当前选项卡和单独的视图类型。这样我就知道我在哪里,如果我退缩,我就知道我需要去哪里。

    我希望这有助于任何问题只需发表评论。

    【讨论】:

    • 可以使用Activity.onBackPressed()方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多