【问题标题】:How backPress works in fragment?backPress 如何在片段中工作?
【发布时间】:2015-10-19 05:16:43
【问题描述】:

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

 /**
 * 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(默认配置文件页面)->Product->Transactions。抽屉图标也会在交易屏幕上可见,用户可以在交易屏幕上使用抽屉再次点击我的卡片屏幕。

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

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

谢谢。

【问题讨论】:

    标签: android fragment android-fragmentactivity


    【解决方案1】:

    片段回压工作代码

    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;
    }
    }
    

    【讨论】:

    • 非常感谢,我从上周开始一直在苦苦挣扎。你真的让我很开心。 :) 再次感谢。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我建议你实现一个接口来管理 backstack。 Here 是一篇很好的博文,可以帮助您了解这个过程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        相关资源
        最近更新 更多