Работаем над фрагментом Backbutton android

Я работаю над блоком навигации и фрагментами, и в настоящее время у меня возникла проблема с изображением. Рассмотрим (Пончик) класс HomeFragment. Чего я хотел бы достичь, так это

этот

когда пользователь перемещается по Фрагменту A(Пончик) -> Фрагмент B(Эклер), затем снова перемещается -> Фрагмент H(kitkat), а затем перемещается -> Фрагмент I(Lollipop)

и пользователь работает над этим. Если пользователь нажимает кнопку, он может работать на основе иерархии, как

super.onBackPressed();

Как результат, нажатие назад приводит к фрагменту I -> фрагменту H -> фрагменту B -> наконец фрагменту A.

Теперь мне нужно перейти непосредственно к фрагменту A, не переходя к другим классам фрагмента.

Я достиг этого используя

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

Здесь я сталкиваюсь с проблемой, учтите, что когда пользователь работает внутри класса Galaxyfragment или любого другого класса фрагмента, он переходит к другому классу фрагмента внутри, а затем нажимает кнопку, после чего он непосредственно переходит к фрагменту A. Итак, здесь мне нужно использовать иерархию обратных стеков и, наконец, к фрагменту класса и завершает приложение, пожалуйста, смотрите код ниже.

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

Так вот

Мне нужно (добиться) использовать кнопку для правильной работы, как Galaxy2Fragment -> GalaxyFragment -> HomeFragment class.

Может ли кто-нибудь дать мне предложения, как работать с этими фрагментами Backbutton в таких случаях. Предложения приветствуются. Благодарю.

4 ответа

Решение

Самый простой способ заменить эту строку

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

в

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

Вам не нужно переопределять onBackPressed, если вы делаете это.

Вы устанавливаете addtobackstack в ноль. Вместо этого вы должны написать TAG имя заменяющего фрагмента.

фрагмент Manager.beginTransaction().replace(R.id.main_fragment_container, фрагмент).addToBackStack(null).commit();

вместо

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

Случай 1: Для перехода непосредственно к 1-му фрагменту из любых других фрагментов, которые открываются позже

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

вызовите этот метод перед открытием фрагментов, кроме 1-го фрагмента

Случай 2: Предполагается - FragmentC -> FragmentB -> FragmentA.

Для этого все, что вам нужно сделать, это использовать fragmentTransaction.addToBackstack(fragment.toString); перед совершением.. а затем переопределите onBackPress в своей деятельности:

@Override
    public void onBackPressed() {

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

            mFragmentManager.popBackStackImmediate();
        }
    }

Удостоверьтесь, что вы не вызываете вышеупомянутый метод, упомянутый для "Case1" прежде, чем передать эти 3 фрагмента

Попробуйте что-то вроде этого...

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

        } else {
            finish();
        }
}
Другие вопросы по тегам