backPress 如何在片段中工作?

How backPress works in fragment?

我正在尝试对片段使用反压。我无法修复它。下面是我的代码。

 /**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    if (position!=3){
        pos = position;
    }
    switch (position) {
        case 0:
            fragment = new Profile();
            break;
        case 1:
            fragment = new Products();
            break;
        case 2:
            fragment = new Help();
            break;
        case 3:
            DialogLogout(DrawerFragment.this, getString(R.string.logout), getString(R.string.cofirm_logout));

            break;
        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment)
                .commit();
        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(pos, true);
        mDrawerList.setSelection(pos);
        setTitle(navMenuTitles[pos]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

在产品片段上,我有一个列表,我再次在其中调用另一个片段。

 listCards.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Fragment fragment = new Transactions();

            if (fragment != null) {
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction()
                     //   .replace(R.id.frame_container, fragment)
                        .remove(Products.this)
                        .add(R.id.frame_container, fragment) //replace(R.id.frame_container, fragment)
                        .addToBackStack(null)
                        .commit();
                } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }
        }
    });
    return rootView;
} 

DrawerFragmentActivity 上的 BackPress 功能如下所示:

@Override
public void onBackPressed() {

    FragmentManager fragmentManager = getSupportFragmentManager();
    int count = fragmentManager.getBackStackEntryCount();
    if (count > 0) {
        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    } else {
        super.onBackPressed();
    }
}

功能类似于 DrawerFragmentActivity(默认情况下是个人资料页面)->产品->交易。抽屉图标也将在交易屏幕上可见,用户可以在使用抽屉的交易屏幕上再次单击我的卡片屏幕。

当用户点击产品时,它会再次打开交易页面,它工作正常。现在发生的事情是,当我们再次点击交易时,它会出现在产品页面上,但是当我再次点击产品列表屏幕(框架)时,它与 ProductsList 和交易屏幕重叠。

很抱歉,如果我感到困惑,如果您不明白,请询问。我可以解释。

谢谢。

片段回按工作代码

public class ChiefFragment extends Fragment {
 View view;

// public OnBackPressedListener onBackPressedListener;

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

view = inflater.inflate(R.layout.activity_chief, container, false);
getActivity().getActionBar().hide();
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        Log.i(getTag(), "keyCode: " + keyCode);
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            getActivity().getActionBar().show();
            Log.i(getTag(), "onKey Back listener is working!!!");
            getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
            // String cameback="CameBack";
            Intent i = new Intent(getActivity(), home.class);
            // i.putExtra("Comingback", cameback);
            startActivity(i);
            return true;
        } else {
            return false;
        }
    }
});
return view;
}
}

我建议您实现一个接口来管理后台堆栈。 Here 是一个很好的博客 post 可以帮助您理解这个过程

使用下面的代码在片段中按下。

public class DashBoard extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dashboard, container, false);
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener(new View.OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
 getActivity().finish(); }
 return true;
 }
 return false;
 }
});
}

此代码可帮助您在片段中实现反向预置。