Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在活动和片段中被压回_Android_Android Fragments_Android Activity_Onbackpressed - Fatal编程技术网

Android 在活动和片段中被压回

Android 在活动和片段中被压回,android,android-fragments,android-activity,onbackpressed,Android,Android Fragments,Android Activity,Onbackpressed,带碎片的导航抽屉。我在主要活动上放了一个片段。但如果我再按一下,同样的碎片会再次出现。我怎么处理这个?? 第二,如何在片段中实现onBackpressed?? 有人能帮我吗 在创建我的主要活动时 FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.mainFrame, new PlaceOrderFragment()); tx.commit(); 而在背后的压

带碎片的导航抽屉。我在主要活动上放了一个片段。但如果我再按一下,同样的碎片会再次出现。我怎么处理这个?? 第二,如何在片段中实现onBackpressed?? 有人能帮我吗

在创建我的主要活动时

    FragmentTransaction tx = getFragmentManager().beginTransaction();
    tx.replace(R.id.mainFrame, new PlaceOrderFragment());
    tx.commit();
而在背后的压力下,我有

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

用片段id替换onCreate中的ypu片段,然后在同一活动上实现onBackpressed,找到id为的片段,检查它是否可见或为null,然后基于它执行操作。
希望您能获得此信息。

您可以使用界面来完成此操作。该接口将在每个片段中实现。下面是一个简单的例子:

        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.
public interface OnBackPressedListener {
    void onBackPressed();
}
在这里,如果您在片段中实现此接口,那么您将发现以下方法:

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

    }
现在,保存该片段的活动应该使用
onBackPressed()
回调。用该方法编写下面的代码

@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);
        }
    }
如果您想获得可见的片段,那么只需使用此方法

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;
    }
公共F getVisibleFragment(){ List fragments=getSupportFragmentManager().getFragments(); if(片段!=null){ for(片段:片段){ if(fragment!=null&&fragment.isVisible()){ 返回(F)片段; } } } 返回null; }
就是这样:)

首先,您需要将fragmnet添加到后堆栈中,以便我们稍后在
onBackPressed()中检索它。

将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();
@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();
            }
    }
}
将您的
on backpressed
替换为此

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();
@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();
            }
    }
}

在事务中,您是否尝试放置“addToBackstack()”?当您可以只添加到backstack时,为什么要这样做。如果您有多个片段,那么您需要一步一步地知道片段是否可用,以便您可以返回片段。我认为OP中没有提到该场景。这只是为了让您知道如何执行该操作