0

I am trying to use backpress on fragments. I am not able to fix it. Here is my code below.

 /**
 * 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");
    }
}

On Product Fragment I have list in which I again use to call another 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;
} 

BackPress functionality on DrawerFragmentActivity is like below:

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

Functionality would be like, DrawerFragmentActivity(Profile page by default)->Product->Transactions. Drawer Icon would be visible on Transactions screen as well, user can click my cards screen again while on transaction screen using drawer.

When user click on product it will again open transactions page, It's working fine. Now what happening is, when we click back on transaction it is coming on Product page, but When I again click on Product list screen(Frame) is overlapping with ProductsList and Transactions screen.

I am sorry if I it's confusing, Please ask if you don't understand. I can explain.

Thanks.

Shivv
  • 65
  • 2
  • 11

3 Answers3

3

Fragment back press working code

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;
}
}
Android
  • 535
  • 5
  • 16
  • 1
    Thanks alot, I was struggling from last one week. You really made my day. :) thanks again. – Shivv Oct 19 '15 at 06:11
0

Use below code for back pressed in fragment.

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

this code help you to implement your backpreesed in fragment.

Amey Bawiskar
  • 361
  • 1
  • 3
  • 17
-1

I would recommend you to implement an interface to manage backstack. Here is a good blog post which would help you understand this process

vaibhav
  • 816
  • 9
  • 13