【问题标题】:How to detect when back button pressed in fragment android?如何检测片段android中何时按下后退按钮?
【发布时间】:2017-08-09 02:43:54
【问题描述】:

我有一个带有片段的导航抽屉项目,有 5 个菜单,问题是当我进入菜单 4 并且我按下后退按钮时应用程序关闭,但我需要应用程序返回到第一个菜单,这是所有菜单在片段中。

这是 Main Activity(导航抽屉)的代码

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");
        }
    }

};

}

我已经在互联网上尝试过解决方案,但它仍然关闭

【问题讨论】:

  • 在片段中创建一个函数,并使用片段对象从活动中的 onBackpressed() 调用它。
  • 我的答案应该是被接受的。它为这个问题提供了完美的解决方案。

标签: android android-fragments back-button


【解决方案1】:

在主要活动中,您需要覆盖以下函数

@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()

【讨论】:

【解决方案2】:

您可以使用setOnKeyListener() 在android 中按键监听。然后,如果您想处理后按,请覆盖 onKey 方法:

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

}

【讨论】:

  • 后退按钮不发送按键事件,而是调用 onBackPressed。
  • @GabeSechan:国际海事组织,它有效。我已经在 Dialog Fragment 中对此进行了测试,因此它也应该在 Fragment 中工作。
  • 它不起作用。它自 2010 年以来一直没有工作。后退和主页按钮无法通过 onKeyPressed 捕获。如果您发现它存在的地方,那可能是错误或来自 OEM 的奇怪版本的操作系统。
  • 好吧,我不知道它是否“应该”工作。但我刚刚在我的对话片段中进行了测试。它确实有效。我的设备是:gennymotion 模拟器,运行 android 6。
  • 我再次检查,它在DialogFragment 中有效,但在Fragment 中无效。有什么解释吗?
【解决方案3】:

在您的 MainActivity 中

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

【讨论】:

    【解决方案4】:

    fragment 中,您应该使用如下内容:

      @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;
                }
            });
        }
    

    【讨论】:

    • 当键盘打开时,我必须点击两次才能执行我的代码。
    【解决方案5】:

    片段的onCreateView添加这个

    Java

    requireActivity().getOnBackPressedDispatcher().addCallback(activity, new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            // in here you can do logic when backPress is clicked
        }
    });
    

    科特林

    activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        // in here you can do logic when backPress is clicked
    }
    

    【讨论】:

      【解决方案6】:

      使用这个(在 kotlin 中)

      activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) {
      override fun handleOnBackPressed() {
          // in here you can do logic when backPress is clicked
      }
      

      })

      我认为这是最优雅的方式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 2013-08-11
        • 2013-07-18
        • 1970-01-01
        相关资源
        最近更新 更多