简体   繁体   中英

Working on Fragment Backbutton android

I am working on navigation drawer and fragments and currently i am facing a problem from image Consider (Donut) is HomeFragment class. What i would like to achieve is

这个

when user navigate Fragment A(Donut) -> Fragment B(Eclair) then again navigates -> Fragment H(kitkat) and then navigates -> Fragment I(Lollipop)

and user working on it. If user press backbutton it may works based on hierarchy as

super.onBackPressed();

As result pressing back results as Fragment I -> Fragment H -> Fragment B -> finally Fragment A.

Now i need to navigate user Directly to Fragment A without going to other Fragment classes.

I have achieved this using

public class MainActivity extends AppCompatActivity {
//initializing 
int check = 0; in MainActivity
....................
...................
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer);

.................
................

 drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView tv = (TextView) view.findViewById(R.id.textView1);
                String aa = tv.getText().toString();
                selectItemFragment(position, aa);
            }
        });

...................
...................
private void selectItemFragment(int position, String aa) {
        Fragment fragment2;
        FragmentManager fragmentManager = getSupportFragmentManager();
        switch (position) {
            case 0:
                fragment2 = new HomeFragment();
                break;
            case 1:
                fragment2 = new GalaxyFragment();
                break;
            case 2:
                fragment2 = new ShareFragment();
                break;
            default:
                fragment2 = new HomeFragment();
                break;
        }
        check = position;
        ffragm = fragment2;
        fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();
        drawerList.setItemChecked(position, true);
        setTitle(aa);
        mDrawerLayout.closeDrawer(drawerList);
    }
..........................
............................
@Override
    public void onBackPressed() {
        if (check == 0) {
            finish();
        } else {
            check = 0;
            Fragment fragment2;
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragment2 = new HomeFragment();
            fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();
        }
}

Here im facing problem, consider when user working inside Galaxyfragment class or any other fragment class, he navigates to another fragment class inside, and then he press backbutton it directly navigates to Fragment A.So, here i need to use back stack hierarchy and finally to Fragment Class and finishes the application please see the below code .

public class GalaxyFragment extends Fragment {
    Context cc;
    Button Addbutton;

    public GalaxyFragment() {
        // Required empty public constructor
    }
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.home_fragment, container, false);
        ll1design = (LinearLayout) v.findViewById(R.id.llone);
        Create_list = (Button) v.findViewById(R.id.submit);
    Addbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                display_button.setVisibility(View.VISIBLE);
                ll1design.setVisibility(View.GONE);
                String value = "";
                Bundle bundle = new Bundle();
                bundle.putString("message", "" + value);
                FragmentManager fragmentManager = getFragmentManager();
                Fragment fragment = new ShareFragment();
                fragment.setArguments(bundle);
                fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack(null).commit();
            }
        });
  return v;
    }
}

So here

i need to(Achieve) use backbutton to working correctly as Galaxy2Fragment -> GalaxyFragment -> HomeFragment class.

Can anyone give me suggestions how to work on these Backbutton fragments on these type of cases. Suggestions are welcome. Thanks.

You are setting addtobackstack to null . Instead you should write the TAG name of replacing fragment.

fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack(null).commit();

instead

fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).addToBackStack("**TAG name of an replacing fragment**").commit();

Case 1: To navigate directly to the 1st fragment from any other fragments that are opened later

private void popByFragment() {
        //keeping only the root fragment in the stack
        int backStackCount = mFragmentManager.getBackStackEntryCount();
        for (int i = 1; i < backStackCount; i++) {
            // we start from "i=1" since we dont wish to pop the 1st fragment added to stack
            //Get backstack fragment id
            //Log.e("backstack count", "count-->" + backStackCount);
            int backStackId = mFragmentManager.getBackStackEntryAt(i).getId();
            mFragmentManager.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
}

call this method before opening fragments other than 1st fragment

Case 2: Assuming - FragmentC -> FragmentB -> FragmentA.

For this all you have to do is use fragmentTransaction.addToBackstack(fragment.toString); before commiting.. and then override onBackPress in your activity:

@Override
    public void onBackPressed() {

        if (getSupportFragmentManager().getBackStackEntryCount() > 1) {

            mFragmentManager.popBackStackImmediate();
        }
    }

Make sure you dont call the above method mentioned for "Case1" before commiting this 3 fragments

Easiest method be to replace this line

fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment2).addToBackStack(null).commit();

to

FragmentTransaction ft =fragmentManager.beginTransaction()
ft.replace(R.id.main_fragment_container, fragment2)
if(fragmentManger.findFragmentById(R.id.main_fragment_container) instanceof HomeFragment)
   ft.addToBackStack(null))
ft.commit();

You don't required to override onBackPressed if you do this.

Try something like this...

 if (!<titleTextView here>.getText().toString().equalsIgnoreCase("<Title of the First Fragment>")) {
            <Open fragment 1>
            <set the title>

        } else {
            finish();
        }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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