Android studio 2.2.3后退按钮活动

问题描述:

我已经创建了一个演示应用程序,它包含菜单抽屉和使用抽屉布局的同一窗口中的选项卡式活动。问题是当我在抽屉菜单中选择它重定向其相关片段页面,但当点击返回按钮的标签活动自动消失,我的应用程序出来了,我该如何解决这个问题?这是我的主要活动代码Android studio 2.2.3后退按钮活动

import android.content.Intent; 
import android.support.design.widget.NavigationView; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends AppCompatActivity { 
    DrawerLayout mDrawerLayout; 
    NavigationView mNavigationView; 
    FragmentManager mFragmentManager; 
    FragmentTransaction mFragmentTransaction; 
    //Button signIn; 


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


     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
     mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ; 

     /** 
     * Lets inflate the very first fragment 
     * Here , we are inflating the TabFragment as the first Fragment 
     */ 

     mFragmentManager = getSupportFragmentManager(); 
     mFragmentTransaction = mFragmentManager.beginTransaction(); 
     mFragmentTransaction.replace(R.id.containerView,new TabFragment()).commit(); 
     /** 
     * Setup click events on the Navigation View Items. 
     */ 

     mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 
       mDrawerLayout.closeDrawers(); 
       if (menuItem.getItemId() == R.id.nav_item_income) { 
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.containerView,new IncomeFragment()).commit(); 

       } 

       if (menuItem.getItemId() == R.id.nav_item_expence) { 
        FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
        xfragmentTransaction.replace(R.id.containerView,new TabFragment()).commit(); 
       } 


       return false; 
      } 

     }); 
     /** 
     * Setup Drawer Toggle of the Toolbar 
     */ 

     android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); 
     ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name, 
       R.string.app_name); 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     mDrawerToggle.syncState(); 

    } 

    } 

这是我的标签活动

package com.example.arunbhaskar.seconddemo; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

/** 
* Created by arun.bhaskar on 2/9/2017. 
*/ 

public class TabFragment extends Fragment { 
    public static TabLayout tabLayout; 
    public static ViewPager viewPager; 
    public static int int_items = 3 ; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     /** 
     *Inflate tab_layout and setup Views. 
     */ 
     View x = inflater.inflate(R.layout.tablayout,null); 
     tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     viewPager = (ViewPager) x.findViewById(R.id.viewpager); 
     /** 
     *Set an Apater for the View Pager 
     */ 

     viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewPager); 
      } 
     }); 

     return x; 

    } 
    class MyAdapter extends FragmentPagerAdapter { 

     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 



     /** 
     * Return fragment with respect to Position . 
     */ 


     @Override 
     public Fragment getItem(int position) 
     { 
      switch (position){ 
       case 0 : return new Pie chart(); 
       case 1 : return new Graph(); 
       case 2 : return new Transaction(); 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 
      return int_items; 
     } 
     @Override 
     public CharSequence getPageTitle(int position) { 

      switch (position){ 
       case 0 : 
        return "pie-chart"; 
       case 1 : 
        return "Graph"; 
       case 2 : 
        return "Transactions"; 
      } 
      return null; 
     } 
    } 
} 
+0

而不是替换片段添加片段。 – nnn

+1

尝试在除第一个片段之外的所有片段事务中添加'fragmentTransaction.addToBackStack(null)'。 –

+0

您的问题解决方案只是将所有片段添加到backStatck,然后在您的活动中覆盖backPress以检查backStackEntry –

当你打电话,你必须添加任何片段。像下面一样

mFragmentTransaction.addToBackStack("your_fregment_tag").commit(); 

当和后备。此代码

@Override 
    public void onBackPressed() { 

     try { 
      int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); 

      if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) { 
       mDrawerLayout.closeDrawer(GravityCompat.END); 
       return; 
      } else { 

       if (backStackEntryCount == 0) { // last fragment 
        android.app.AlertDialog.Builder alertDialog = new android.app.AlertDialog.Builder(DashboardActivity.this); 

        alertDialog.setTitle("Exit"); 
        alertDialog.setMessage("Are you sure you want to Exit?"); 

        alertDialog.setPositiveButton("YES", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int which) { 
            //finish(); 
            //System.exit(0); 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
             finishAffinity(); 
            }else{ 
             finish(); 
             System.exit(0); 
            } 


           } 
          }); 

        alertDialog.setNegativeButton("NO", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int which) { 
            dialog.cancel(); 
           } 
          }); 

        alertDialog.show(); 
        return; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 



     super.onBackPressed(); 
    } 

尝试使用backStack。你必须触发它。请检查我的代码

创建onbackpress功能时,您的主要活动 例如像这样

@Override 
public void onBackPressed() { 
    if (count == 1) { 
     if (exit) { 
      super.onBackPressed(); 
      return; 
     } else { 
      Toast.makeText(this, "Press Back again to Exit.", Toast.LENGTH_SHORT).show(); 
      exit = true; 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        exit = false; 
       } 
      }, 2000); 
     } 
    }else { 
     toolbar.setTitle("Home"); 
     mDrawerLayout.closeDrawers(); 
     count=1; 
     display(0); 
    } 
} 

设置您的家庭片段的数量为“1”,其他intger其他片段

更新您的NavigationItemSelectedListener有了这个。

mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 
      mDrawerLayout.closeDrawers(); 
      if (menuItem.getItemId() == R.id.nav_item_income) { 
       FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
       IncomeFragment fragment = new IncomeFragment(); 
       String fragClassName = fragment.getClass().getName(); 
       fragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(fragClassName).commit(); 
      } 

      if (menuItem.getItemId() == R.id.nav_item_expence) { 
       FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
       TabFragment fragment = new TabFragment(); 
       String fragClassName = fragment.getClass().getName(); 
       xfragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(fragClassName).commit(); 
      } 
      return false; 
     } 

    }); 

首先添加您的片段在堆栈中:

if (menuItem.getItemId() == R.id.nav_item_income) { 
       FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
       fragmentTransaction.addToBackStack(null) //this line is needed 
       fragmentTransaction.replace(R.id.containerView,new IncomeFragment()).commit(); 

      } 

现在,在您的活动:覆盖onBackPressed()方法

@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      Log.i("MainActivity", "popping backstack"); 
      fm.popBackStack(); 
     } else { 
      Log.i("MainActivity", "nothing on backstack, calling super"); 
      new AlertDialog.Builder(this) 
       .setMessage("Are you sure you want to exit?") 
       .setCancelable(false) 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         finishAffinity(); 
        } 
       }) 
       .setNegativeButton("No", null) 
       .show(); 
     } 
    }