Go назад от фрагмента к основному фрагменту - PullRequest
1 голос
/ 28 марта 2020

Это моя основная деятельность, в которой я называю свои фрагменты:

public class what extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mToggle;


    private ListView mDrawerList;
    private ArrayAdapter<String> mAdapter;
    private FragmentTransaction fragmentTransaction;
    NavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_what);


        mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
        mToggle=new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
        mDrawerLayout.addDrawerListener(mToggle);
        mToggle.syncState();

        fragmentTransaction= getSupportFragmentManager().beginTransaction();


        fragmentTransaction.add(R.id.main_content,new mainfrag());
        fragmentTransaction.commit();

        ActionBar actionBar= getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        navigationView=(NavigationView)findViewById(R.id.nav_view);
        navigationView.getMenu().getItem(1).setChecked(false);
        navigationView.getMenu().getItem(0).setChecked(true);
        navigationView.getMenu().getItem(2).setChecked(false);
        navigationView.getMenu().getItem(3).setChecked(false);


        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.nav_main:
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_main);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new mainfrag());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("SGPA and CGPA Calculator"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_savedcal:
                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_savedcal);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new savedFragment());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("Saved Calculations"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_upldoc:
                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(3).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_upldoc);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new uploadedfragment());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("Uploaded documents"));
                        item.setChecked(true);
                        break;
                    case R.id.nav_site:

                        navigationView.getMenu().getItem(0).setChecked(false);
                        navigationView.getMenu().getItem(1).setChecked(false);
                        navigationView.getMenu().getItem(2).setChecked(false);
                        navigationView.setCheckedItem(R.id.nav_site);
                        mDrawerLayout.closeDrawers();
                        fragmentTransaction=getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.main_content, new resultsite());
                        fragmentTransaction.commit();
                        getSupportActionBar().setTitle(("VTU Results"));
                        item.setChecked(true);
                        break;

                }

                return false;
            }
        });

    }


    public boolean onOptionsItemSelected(MenuItem item ){
        if(mToggle.onOptionsItemSelected(item)){
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override

    public void onBackPressed() {

            DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case DialogInterface.BUTTON_POSITIVE: {
                            finish();
                        }


                        break;

                        case DialogInterface.BUTTON_NEGATIVE:
                            break;
                    }
                }
            };

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Are you sure you want to exit?").setPositiveButton("Yes", dialogClickListener)
                    .setNegativeButton("No", dialogClickListener).show();

            return;
    }
}

Это мой фрагмент по умолчанию:

public class mainfrag extends Fragment {

    private View view;
    private AdView adView;
    private Button button10;
    private Button button11;

    public mainfrag() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        view = inflater.inflate(R.layout.fragment_mainfrag, container, false);

        adView = view.findViewById(R.id.adView);

        button10 = (Button) view.findViewById(R.id.button10);
        button10.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openmainactivity();
            }
        });
        button11 = (Button) view.findViewById(R.id.button11);
        button11.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openscheme();
            }
        });
        return view;
    }

    public void openmainactivity() {
        Intent intent = new Intent(getContext(), MainActivity.class);
        startActivity(intent);
    }
    public void openscheme(){
        Intent intent=new Intent(getContext(), scheme.class);
        startActivity(intent);
    }
}

Это один из других фрагментов:

public class savedFragment extends Fragment {


    RecyclerView recyclerview;
    adapter_sgpa recyclerAdapter;

    ArrayList<POJO> sgpaArrayList;

    public savedFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FragmentTransaction tx = getChildFragmentManager().beginTransaction();
        tx.replace(R.id.container, new sgpa_frag());
        tx.commit();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            Fragment fragment = null;
            switch (id) {
                case R.id.navigation_sgpa:
                    sgpa_frag sf = new sgpa_frag();
                    FragmentManager fragmentManager = getChildFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.container, sf).commit();
                    return true;
                case R.id.navigation_cgpa:
                    cgpa_frag cf = new cgpa_frag();
                    fragmentManager = getChildFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.container, cf).commit();
                    return true;
            }
            return false;
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_saved, container, false);

        BottomNavigationView nav = (BottomNavigationView) v.findViewById(R.id.bottom_navigation);
        nav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        return v;
    }
}

Какие изменения я должен внести в этот код, чтобы при нажатии кнопки «Назад» я мог вернуться от других фрагментов к основному фрагменту?

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Думаю, я знаю, что тебе нужно. взгляните на последнюю часть этой документации

"Вы можете добавить транзакцию фрагмента в задний стек. Задний стек отслеживает действия в вашем приложении, которые можно отследить, когда пользователь нажимает на устройстве стандартную кнопку «назад» Android. Если вы добавляете фрагмент транзакции в стек стека, транзакция может быть возвращена (отменена) с помощью нажатия кнопки «Назад» на устройстве «цитата из Jenkov *» 1005 *

просто сделайте fragmentTransaction.addToBackStack(null) на своем основном действии, прежде чем выполнять фиксацию, это позволит вам вернуться назад, используя кнопку назад

, если вы всегда хотите вернуться к основному фрагменту, тогда вы хотите чтобы добавить только основной фрагмент в backstack таким образом, при нажатии на кнопку «назад» вы всегда окажетесь там

в этой части вашего создания:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_what);


    mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
    mToggle=new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
    mDrawerLayout.addDrawerListener(mToggle);
    mToggle.syncState();

    fragmentTransaction= getSupportFragmentManager().beginTransaction();


    fragmentTransaction.add(R.id.main_content,new mainfrag());
    //HERE YOU PUT THE CODE V
    fragmentTransaction.addToBackStack(null);
    //HERE YOU PUT THE CODE ^
    fragmentTransaction.commit();

    ActionBar actionBar= getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    // ALL THE OTHER STUFF COMMING AFTER
0 голосов
/ 28 марта 2020

Поддерживайте одну логическую переменную, чтобы проверить, является ли текущий фрагмент MainFragment или нет.

, если это не MainFragment -> replace MainFragment

Остальное -> super.onBackPressed ()

ex:

 private boolean isMainFragment=true; //make it false when move to other fragment


@Override

public void onBackPressed() {
  if(!isMainFragment){
      isMainFragment=true;
     //replace your MainFragment
    }
  else{
   //your logic show dialog or super.onBackPressed()
  }

}
...