如何从导航抽屉中的片段到MainActivity实现onBackPress

时间:2017-03-17 07:08:28

标签: android

我想在我的片段上实现onBackPress,但我不知道如何。当我去另一个片段时(在这种情况下,我的片段是来自我的ActivityHome的片段,我使用来自android stuudio的标准NavigationDrawer)。

这是我的ActivityHome代码

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        DrawerLayout 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.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        FragmentHome fragment = new FragmentHome();
        fragmentTransaction.add(R.id.containerID, fragment);
        fragmentTransaction.commit();

    }

    @Override
    public void onBackPressed() {
        DrawerLayout 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.activity_home, 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_logout) {
            Toast.makeText(getApplicationContext(),
                    "Akun anda telah dikeluarkan!", Toast.LENGTH_LONG).show();
            Intent logout = new Intent(ActivityHome.this, ActivityMain.class);
            startActivity(logout);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {

        int id = item.getItemId();

        if(id == R.id.nav_home){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, FragmentHome.newInstance()).commit();
        }else if (id == R.id.nav_profile){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, Profile.newInstance()).commit();
        }
        else if (id == R.id.nav_history){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, History.newInstance()).commit();
        }
        else if (id == R.id.nav_about_us){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, AboutUs.newInstance()).commit();
        }
        else if (id == R.id.nav_ganti_kata_sandi){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, GantiKataSandi.newInstance()).commit();
        }
        else if (id == R.id.nav_share){
            ActivityHome.this.getSupportFragmentManager().beginTransaction().replace(R.id.containerID, Share.newInstance()).commit();
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

我希望你们能解决我的问题。

3 个答案:

答案 0 :(得分:0)

我在片段中有webview,我用这段代码来检测mainactivity OnbackPressed()中的backpress代码:

Fragment webview = getSupportFragmentManager().findFragmentByTag("BLOG");
        if (webview instanceof BlogFragment) {
            boolean goback = ((BlogFragment) webview).canGoBack();
            if (!goback) {


            } else {
                ((BlogFragment) webview).goBack();
            }

        }

确保您开始像:

一样的片段
getSupportFragmentManager()
                            .beginTransaction()
                            .addToBackStack(null)
                            .replace(R.id.frame_content, new BlogFragment(), "BLOG")
                            .commit();

答案 1 :(得分:0)

从活动中打开片段。

Fragment fragment = Fragment.newInstance();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.fragment_slide_left_enter,
        R.anim.fragment_slide_left_exit, R.anim.fragment_slide_right_enter,
        R.anim.fragment_slide_right_exit);
        addFragmentToActivity(fragmentTransaction, Fragment, R.id
        .content_frame);


public void addFragmentToActivity(@NonNull FragmentTransaction transaction,
                                         @NonNull Fragment fragment, int frameId) {
    transaction.addToBackStack(fragment.getClass().getName());
    transaction.add(frameId, fragment, fragment.getClass().getName());
    transaction.commit();
}

这就是我在HomeActivity中添加片段的方法以及HomeActivity中的Back Back Call方法OnBackPressed。

@Override
public void onBackPressed() {

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

            getSupportFragmentManager().popBackStackImmediate();

}

答案 2 :(得分:0)

当从Activity的onBackPressed()方法中的任何片段按下后退按钮时,您可以获得事件。 假设你已经从HomeFragment回来了,那么你可以在Activity中获得onBackPressed,如下所示:

@Override
public void onBackPressed() {
HomeFragment fragment = (Fragment)findFragmentById(// fragment id);
if(fragment!=null && fragment.isVisible()){
   // Here you can code for Home Fragment's onBackPress()
    }
    super.onBackPressed();
}