2017-03-17 137 views
3

我有导航抽屉与片段,与5菜单,问题是当我去菜单4,我按后退按钮应用程序关闭,但我需要的应用程序回到第一个菜单,这是所有的菜单分段。如何检测当在按钮片断android按下后按钮?

这是主要活动(抽屉式导航)代码

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    /** 
    *Setup the DrawerLayout and NavigationView 
    */ 

    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 Recommendation()).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_lux_level_recomen) { 
       FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.containerView,new Recommendation()).commit(); 

      } 

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

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

      if (menuItem.getItemId() == R.id.nav_item_conversions) { 
       FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
       xfragmentTransaction.replace(R.id.containerView,new Conversion()).commit(); 
      } 
      if (menuItem.getItemId() == R.id.nav_item_lux) { 
       FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
       xfragmentTransaction.replace(R.id.containerView,new LuxSensor()).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(); 




} 

菜单的这一个(片段)

public class LuxSensor extends Fragment { 
TextView textLIGHT_available, textLIGHT_reading; 
FragmentManager mFragmentManager; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View x = inflater.inflate(R.layout.lux_sensor,null); 
    textLIGHT_reading 
      = (TextView)x.findViewById(R.id.LIGHT_reading); 

    SensorManager mySensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE); 

    Sensor LightSensor = mySensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 
    if(LightSensor != null){ 
     mySensorManager.registerListener(
       LightSensorListener, 
       LightSensor, 
       SensorManager.SENSOR_DELAY_NORMAL); 

    }else{ 
     textLIGHT_available.setText("Sensor.TYPE_LIGHT NOT Available"); 
    } 
    FragmentManager fm = getFragmentManager(); 

    return x; 
} 





private final SensorEventListener LightSensorListener 
     = new SensorEventListener(){ 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if(event.sensor.getType() == Sensor.TYPE_LIGHT){ 
      textLIGHT_reading.setText(event.values[0]+" LUX"); 
     } 
    } 

}; 

}

我曾尝试在网上解决方案,但它仍然已关闭

+0

在片段中创建一个函数,并使用片段对象从onBackpressed()从活动中调用它。 –

回答

2

在您的MainActivity

@Override 
public void onBackPressed() 
{ 
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.containerView,new Recommendation()).commit(); 
} 
+0

感谢它的工作:)) –

3

在主要活动中,您需要覆盖以下功能

@Override 
public void onBackPressed() 
{ 
    // code here to check what fragment you are on and handle that accordingly 
    super.onBackPressed(); // this exits the app. 
} 

文档可以在这里找到:https://developer.android.com/reference/android/app/Activity.html#onBackPressed()

+1

***“代码..检查你在哪个片段上”*** - 请参阅'getActiveFragment()'这里:https://stackoverflow.com/a/15543580/2162226 – gnB

0

您可以在Android的按键监听使用setOnKeyListener()。然后,如果你要处理的背衬,覆盖onKey方法:

@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
     // do your thing 
    } 

} 
+1

后退按钮不会发送一个关键事件,它调用onBackPressed代替。 –

+0

@GabeSechan:国际海事组织,它的工作原理。我已经在Dialog Fragment中测试过了,所以它也应该在fragment中工作。 – Yashasvi

+1

它不起作用。它自2010年以来一直无法使用。后退按钮和主屏幕按钮无法通过onKeyPressed进行捕捉。如果你找到了一个它所在的地方,它可能是来自OEM的一个bug或者一个奇怪的操作系统版本。 –

-1

片段你应该使用这样的事情:

@Override 
    //Pressed return button - returns to the results menu 
    public void onResume() { 
     super.onResume(); 
     getView().setFocusableInTouchMode(true); 
     getView().requestFocus(); 
     getView().setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ 

       //your code 

        return true; 
       } 
       return false; 
      } 
     }); 
    }