【问题标题】:Backstack android fragment navigationBackstack android片段导航
【发布时间】:2014-12-11 07:34:58
【问题描述】:

这是我使用导航抽屉显示片段的方式:

private void displayView(int position) {
            // update the main content by replacing fragments
            Fragment fragment = null;
            switch (position) {
            case 0:
                fragment = new Fragment0();
                break;
            case 1:
                fragment = new Fragment1();
                break;
            case 2:
                fragment = new Fragment2();
                break;
            case 3:
                fragment = new Fragment3();
                break;
            case 4:
                fragment = new Fragment4();
                break;
            case 5:
                fragment = new Fragment5();

                }

            default:
                break;
            }

            if (fragment != null) {
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.frame_container, fragment)
                        .addToBackStack(null)
                        .commit();

                // update selected item and title, then close the drawer
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(navMenuTitles[position]);
                mDrawerLayout.closeDrawer(drawerll);
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }
        }

假设如果用户导航到 Fragment 2-> Fragment 5-> Fragment3.

如果用户点击 back button 我需要有descending order 并且在每个片段上我显示片段的name 当他去那个特定的fragment 即:

Fragment 3-> Fragment 5-> Fragment2.

这是我尝试过的:

第一种方法:

FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStackImmediate();
}

第二种方法:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

我无法让这个工作**(即..我无法将它移回我来自的片段**)并且无法根据后台堆栈显示片段的名称

非常感谢任何帮助。

【问题讨论】:

  • This 会有所帮助
  • @SweetWishershi-我在这一行遇到错误 Fragment fragment = fragManager.getFragments().get(count>0?count-1:count);声明 getFragments 未为 Fragmentmanager 定义
  • 我认为你的后台工作正常。您可以以相同的方式导航回去。如果您想获取堆栈计数,可以使用 getSupportFragmentManager().getBackStackEntryCount() 方法
  • 是的,但是如何设置标题,因为单击后退按钮时标题没有改变
  • 你需要使用getSupportFragmentManager()即v4.Fragment

标签: android android-fragments fragment-backstack


【解决方案1】:

我猜你的导航工作正常,你面临的问题是你可以使用的标题

public class SampleFragment extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

                // Creating view correspoding to the fragment
        View v = inflater.inflate(R.layout.fragment_layout, container, false);

        // Updating the action bar title
        getActivity().getActionBar().setTitle("Screen name");


        return v;
    }
}

在每个片段中。并且每当您按下 fragmemt 的 onCreateView 方法(从后台堆栈中弹出的方法)时,都会调用该标题,并且该标题将再次设置替换旧标题。

【讨论】:

    【解决方案2】:

    1。把手返回

    您可以在onBackPressed 中使用getSupportFragmentManager().popBackStack() 方法:

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
             getSupportFragmentManager().popBackStack();
             getSupportFragmentManager().beginTransaction().commit();
        }
        else {
            super.onBackPressed();
        }
    }
    

    不要忘记在 BackStack 中添加片段,例如:

    transaction.addToBackStack(null);
    

    2。显示名称

    要在操作栏中显示当前片段名称,您可以在片段的onResume 上获取它:

    @Override
    protected void onResume() {
        super.onResume();
    
        ((FrgmentActivtiyName)getActivity).changeTitle("title");
    }
    

    在你的FrgmentActivity的actionbar中定义一个设置标题的方法:

    public void changeTitle(String titleToSet) {
       // set title as titleToSet
    }
    

    希望对你有所帮助ツ

    【讨论】:

    • 我认为这不是必需的,因为他在返回时能够以相同的顺序显示 backstack 中的所有片段。所以不需要从堆栈中添加或删除任何片段
    • @SweetWishershi- arun 说的是对的。我可以给他们看,但问题出在标题上。
    • 这句话是怎么说的:我无法让这个工作(即..我无法将它移回我来自的片段) 并且无法根据 backstack 显示片段的名称。它说不能能够向后移动
    【解决方案3】:

    请试试这个:

    在保存片段的活动中,覆盖onbackPressed()方法,

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
             getSupportFragmentManager().popBackStack();
             getSupportFragmentManager().beginTransaction().commit();
        }
        else {
            super.onBackPressed();
        }
    }
    

    【讨论】:

    • @Bhargav-here 如何获取片段的位置?
    【解决方案4】:
    if (fragment != null) {
    
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();
            menuList.setItemChecked(position, true);
            menuList.setSelection(position);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 2014-09-26
      • 1970-01-01
      • 2021-05-16
      • 2012-10-24
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多