简体   繁体   English

活动和片段中按下了onBack

[英]onBack pressed in activity and fragment

Navigation drawer with fragments. 带有片段的导航抽屉。 I have placed one fragment on main activity. 我在主要活动上放了一个片段。 But if i back press the same fragment comes again. 但是,如果我后按相同的片段再次出现。 How can I handle this?? 我该如何处理? and secondly how to implement onBackpressed in fragments?? 其次如何在片段中实现onBackpressed? Can anybody help me out? 有人可以帮我吗?

in onCreate of main activity I have 在主要活动的onCreate中

    FragmentTransaction tx = getFragmentManager().beginTransaction();
    tx.replace(R.id.mainFrame, new PlaceOrderFragment());
    tx.commit();

and in back press of it I have 在它的后按中

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}
        FragmentTransaction tx = getFragmentManager().beginTransaction();
            tx.replace(R.id.mainFrame, new PlaceOrderFragment()).addToBackStack("your tag");
            tx.commit();


        Override onBackPress() and try following code.

        @Override
        public void onBackPressed() {

            int count = getFragmentManager().getBackStackEntryCount();

            if (count == 0) {
                super.onBackPressed();
                //your other utility code if needed
            } else {
                getFragmentManager().popBackStack();
            }

    }

Hope this will work for you.

You can do this using Interface. 您可以使用Interface来执行此操作。 That interface will implemented in each fragment. 该接口将在每个片段中实现。 Here is a simple example: 这是一个简单的示例:

public interface OnBackPressedListener {
    void onBackPressed();
}

Here, if you implement this interface in your fragment then you will found this method: 在这里,如果您在片段中实现此接口,则将发现此方法:

@Override
    public void onBackPressed() {
        getActivity().finish(); // Or Do your specific task

    }

Now your Activity that holds that fragment , that should use onBackPressed() callback. 现在,包含该片段的Activity应当使用onBackPressed()回调。 Write bellow code in that method 用这种方法写下面的代码

@Override
    public void onBackPressed() {

        if (YOUR_DRAWER.isDrawerOpen(GravityCompat.START)) {
            YOUR_DRAWER.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
            return;
        }

        Fragment fragment=getYourVisibleFragment();
        if(fragment!=null){
            ((OnBackPressedListener)fragment).onBackPressed();
        }else{
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    }

If you want to get Visible fragment then just use this method 如果要获取可见片段,请使用此方法

public <F extends Fragment> F getVisibleFragment() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment != null && fragment.isVisible()) {
                    return (F) fragment;
                }
            }
        }
        return null;
    }

That's it :) 而已 :)

First you need to add the fragmnet to back stack so we could retrieve it later in onBackPressed() 首先,您需要将fragmnet添加到后堆栈,以便稍后可以在onBackPressed()检索它。

Replace your fragmnet transaction with this 以此替换您的fragmnet交易

FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment());
// HERE WE WILL ADD FRAGMENT TO BACKSTACK SO WE COULD GET BACK TO IT
tx.addToBackStack(null);
tx.commit();

Replace your onBackPressed with this 将此替换为onBackPressed

@Override
public void onBackPressed() {
    // CHECKS HOW MANY FRAGMENTS ARE IN THE BACKSTACK
    int count = getFragmentManager().getBackStackEntryCount();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (count == 0) {
                // IF NO FRAGMENT IN THE BACKSTACK CALL
                super.onBackPressed();
            } else {
                // GET THE LAST OPENED FRAGMENT
                getFragmentManager().popBackStack();
            }
    }
}

Replace ypu fragment in onCreate with fragment id , and then implement onBackpressed on the same activity and find that fragment with id and check is it visible or null and then perform operations based on it. 将onCreate中的ypu片段替换为片段id,然后对同一活动实施onBackpressed,并找到具有id的片段,并检查其可见或为空,然后基于该片段执行操作。 hope you got this. 希望你明白了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM