向上移动堆栈的碎片

时间:2014-05-14 09:12:47

标签: android android-fragments

我想在操作栏上添加一个回家按钮,当我的活动有两个片段时:

但它似乎没有将我的第一个片段添加到堆栈中,因为我得到了“count entry:0”的日志

public class LoginActivity extends FragmentActivity {

    private static android.support.v4.app.FragmentManager fm;

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

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        Fragment fragment = this;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_login,
                    container, false);

            TextView tv = (TextView) rootView.findViewById(R.id.signUpText1);
            tv.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    FragmentTransaction ft = getFragmentManager()
                            .beginTransaction();
                    ft.hide(fragment);
                    ft.add(R.id.container, new SignupFragment());
                    ft.addToBackStack(null);
                    ft.commit();
                }
            });

            return rootView;
        }
    }

    public static class SignupFragment extends Fragment {

        public SignupFragment() {
            // TODO Auto-generated constructor stub
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            View signupView = inflater.inflate(R.layout.fragment_signup,
                    container, false);

            ActionBar ab = getActivity().getActionBar();
            ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
            ab.setDisplayHomeAsUpEnabled(true);
            ab.setDisplayShowHomeEnabled(true);

            return signupView;
        }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case android.R.id.home:
            fm = getSupportFragmentManager();

            Log.e("LoginActivity", "count entry:" + fm.getBackStackEntryCount());
            if (fm.getBackStackEntryCount() > 0) {
                // fm.popBackStack();
            }
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

}

如何正确地将片段添加到后栈(是否可能?) 谢谢你,抱歉新手问题。

1 个答案:

答案 0 :(得分:0)

您能否澄清一下您的碎片路径? 从你的问题我明白你有PlaceholderFragment,然后你从那里转到SignupFragment?对? 由于您的第一个片段(PlaceholderFragment)以这种方式初始化

if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
}

我认为你不要将这个片段添加到后台堆栈,所以后台堆栈是空的。替换为。

if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .addToBackStack("optionalName").commit();
}

我认为应该解决它。

编辑:

switch (item.getItemId()) {
    case android.R.id.home:
        fm = getSupportFragmentManager();

        Log.e("LoginActivity", "count entry:" + fm.getBackStackEntryCount());
        if (fm.getBackStackEntryCount() > 0) {
            // fm.popBackStack();
        }
        break;

在这里你使用的是SupportFragmentManager,你在使用FragmentManager,这些是不同的,不能混合,你坚持使用其中任何一个。如果你想支持api 11以下的低api设备,请使用SupportFragmentManager,如果不坚持FragmentManager。

由于您将两个片段添加到FragmentManager,因此SupportFragmentManager后台堆栈仍为空。

最好的问候