2016-11-13 82 views
0

实施onBackPress上禁止出境的片段引起我的应用程序有一些片段,我可以从应用程序通过点击手机上的背面没有问题退出,但是当我上实现onBackPress我不能从应用程序退出的Android应用程序从

我的代码:

@Override 
public void onResume() { 
    super.onResume(); 
    if (getView() == null) { 
     return; 
    } 
    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) { 
       if (slider_call_phones.isOpened()) { 
        slider_call_phones.closeLayer(true); 
       } 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

我要处理的片段不活动onBackPressed

+0

此代码未实现'onBackPressed()'。如果你摆脱了这个代码,而是实现'onBackPressed()',你可能会有更好的运气。 – CommonsWare

+0

【如何实现片段onBackPressed()?] @CommonsWare你的意思是(http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –

+0

'onBackPressed'可能的工作重复罚款碎片? –

回答

0

这里是我如何做到这一点,

  • 创造条件,在实现它的任何类 收到onBackPressed(),如果它处理的方法或否则为false将返回true的接口。这将确保您的应用程序在您返回false时退出。
  • Activity创建这些接口的堆栈,然后添加任何此类接口的它。
  • 覆盖onBackPressed()在您的活动,然后任何时间,它被称为,从堆栈一个监听器和调用自己的onBackPressed()如果它返回true。如果它返回false,那么它不会处理onBackPressed(),因此Activity可以接管并删除片段或退出应用程序。

这里是一个样本实现。

您的活动

public class MyActivity extends Activity { 

//a stack of OnBackPressedListeners, stack one when you want it to receive onBackPressed() from 
//this activity. 
//PS used stack so that by LIFO, the last listener would be the first to be called. 
private Stack<OnBackPressedListener> onBackPressedListeners = new Stack<>(); 

@Override 
public void onBackPressed() { 
    if (!onBackPressedListeners.isEmpty()) { 
     if (onBackPressedListeners.peek().onBackPressed()) //if interface is handling onBackPressed(), return. Otherwise super would be called below. 
      return; 
    } 

    //if no listeners, then do super. This would ensure natural behaviour such as closing the app or popping a fragment when no listeners are using onBackPressed() 
    super.onBackPressed(); 
} 

//listener interface 
public static interface OnBackPressedListener { 

    /** 
    * @return true if you're handling onBackPressed, false otherwise to let super.onBackPressed() take over 
    */ 
    public boolean onBackPressed(); 
} 

public void addOnBackPressedListener(OnBackPressedListener listener) { 
    onBackPressedListeners.add(listener); 
} 

public void removeOnBackPressedListener(OnBackPressedListener listener) { 
    onBackPressedListeners.remove(listener); 
} 

} 

在您的片段

//implement OnBackPressedListener in your fragment. 
public class MyFragment extends Fragment implements OnBackPressedListener { 


    //find somewhere to add the listener to your Activity, most likely in onCreateView(...) 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     ... 

     ((MyActivity)getActivity()).addOnBackPressedListener(this); 

     ... 

     return view; 
    } 

    //overide onBackPressed(), then return true if you're handling the onBackPressed(), false otherwise. 
    @Override 
    public boolean onBackPressed() { 
     if (slider_call_phones.isOpened()) { 
      slider_call_phones.closeLayer(true); 
      return true; 
     } 
     return false; 
    } 

    //lastly remember to remove the listener when your fragment is destroyed, so that it stops receiving callbacks, 
    //if you don't do this, you might get a NullPointerException. 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     ((MyActivity)getActivity()).removeOnBackPressedListener(this); 
    } 
} 

我大多使用单Activity和一大堆的在我的Android应用Fragment的,这正是我如何解决您遇到的问题,例如,如果在按下后退按钮时打开抽屉中的抽屉,或者在退出应用程序时退出应用程序关闭。

-1

你应该为了从应用程序退出调用onBackPressed()以下列方式:

public void onBackPressed(){ 
    finishAffinity(); 
} 
相关问题