如何处理后退按钮去特定片段?

时间:2017-08-24 14:08:33

标签: android android-fragments

我用带有片段的导航抽屉制作项目,导航有3个片段。我有问题,当我在第三个片段时,我按下按钮,应用程序突然关闭,但我想要做的是从第三个片段到第一个片段的片段更改。我怎么能这样做?

这是我的MainActivity代码:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    Toolbar toolbar;
    DrawerLayout drawer;
    NavigationView navigationView;
    FragmentManager fragmentManager;
    FragmentTransaction fragmentTransaction;
    Fragment fragment = null;
    SessionManager session;
    TextView kode_kt, nama_ketua;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        session = new SessionManager(getApplicationContext());
        session.checkLogin();

        fragmentManager = getFragmentManager();
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        View header=navigationView.getHeaderView(0);

        kode_kt = (TextView)header.findViewById(R.id.username);
        nama_ketua = (TextView)header.findViewById(R.id.email);
        HashMap<String, String> user = session.getUserDetails();


        kode_kt.setText(user.get(SessionManager.KEY_KODE));
        nama_ketua.setText(user.get(SessionManager.KEY_KETUA));
//        email.setText("Jopa Software House");

        // tampilan default awal ketika aplikasii dijalankan
        if (savedInstanceState == null) {
            fragment = new Monitoring();
            callFragment(fragment);
        }

    }

    @Override
    public void onBackPressed() {
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Toast.makeText(getApplicationContext(), "Action Settings", Toast.LENGTH_SHORT).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        // Untuk memanggil layout dari menu yang dipilih
        if (id == R.id.nav_camera) {
            fragment = new Monitoring();
            callFragment(fragment);
        } else if (id == R.id.nav_gallery) {
            showDialog();
        } else if (id == R.id.nav_send) {
            fragment = new Akun();
            callFragment(fragment);
        }

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    // untuk mengganti isi kontainer menu yang dipiih
    private void callFragment(Fragment fragment) {
        fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.remove(fragment);
        fragmentTransaction.replace(R.id.frame_container, fragment);
        fragmentTransaction.commit();
    }

    private void showDialog(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                this);

        // set title dialog
        alertDialogBuilder.setTitle("Keluar Akun");

        // set pesan dari dialog
        alertDialogBuilder
                .setMessage("Anda ingin keluar dari akun?")
                .setIcon(R.mipmap.ic_launcher)
                .setCancelable(false)
                .setPositiveButton("Ya",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        // jika tombol diklik, maka akan menutup activity ini
                        session.logoutUser();
                    }
                })
                .setNegativeButton("Tidak",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // jika tombol ini diklik, akan menutup dialog
                        // dan tidak terjadi apa2
                        dialog.cancel();
                    }
                });

        // membuat alert dialog dari builder
        AlertDialog alertDialog = alertDialogBuilder.create();

        // menampilkan alert dialog
        alertDialog.show();
    }

}

4 个答案:

答案 0 :(得分:1)

在您的活动中使用此代码

@Override
    public void onBackPressed() {
        Fragment  f = getSupportFragmentManager().findFragmentById(R.id.maincontainer);
        if (f instanceof FirstFragment) {
           // do operations

        } else if (f instanceof SecondFragment) {
           // do operations

        }  else if (f instanceof ThirdFragment) {
           // do operations

        }else {
            super.onBackPressed();
        }

    }

并使用....

getSupportFragmentManager().popBackStack();

用于从您的STACK中删除片段

答案 1 :(得分:0)

添加片段时,您应该将片段添加到Backstack中,以便Android能够为您的后台堆栈处理弹出窗口。

您可以在此处阅读更多内容:https://developer.android.com/training/implementing-navigation/temporal.html

因此,您的代码如下:

fragmentTransaction.remove(fragment);
fragmentTransaction.replace(R.id.frame_container, fragment);
fragmentTransaction.addToBackStack();
fragmentTransaction.commit();

答案 2 :(得分:0)

按下“返回”按钮后,当您为要返回的片段调用fragmentTransaction.replace()时,请尝试将其添加到backStack,如下所示:

private void callFragment(Fragment fragment) {
        fragmentTransaction = fragmentManager.beginTransaction();
        if (fragment instanceof Monitoring)
            fragmentTransaction.addToBackStack(null);
        fragmentTransaction.replace(R.id.frame_container, fragment);
        fragmentTransaction.commit();
    }

答案 3 :(得分:0)

  @Override
public void onBackPressed() {
    // This overrides default behavior for onBackPressed so that it does nothing.
    // This fixes the bug where when you disconnect the watch from wire, and reconnect,
    // the current current fragment will pop out.
    Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
    if (f instanceof CustomFragmentClass) {// do something with f
        ((CustomFragmentClass) f).doSomething();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_holder,new FragmentSample());
transaction.commit();
    }
}