In MainActivity:

getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTwoFragment, "gifPageTwoFragment").addToBackStack("gifPageTwoFragment").commit();

In GifPageTwoFragment:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
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) {
Log.e("gif--","fragment back key is clicked");
getActivity().getSupportFragmentManager().popBackStack("gifPageTwoFragment", FragmentManager.POP_BACK_STACK_INCLUSIVE);
return true;
}
return false;
}
});
}

In your oncreateView() method you need to write this code and in KEYCODE_BACk condition you can write whatever the functionality you want

  View v = inflater.inflate(R.layout.xyz, container, false);
//Back pressed Logic for fragment
v.setFocusableInTouchMode(true);
v.requestFocus();
v.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
getActivity().finish();
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent); return true;
}
}
return false;
}
});
 view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) { Fragment NameofFragment = new NameofFragment; FragmentTransaction transaction=getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container,NameofFragment); transaction.commit(); return true;
}
return false;
}
}); return view;

繁琐的方法:

I am using Android Sliding Menu using Navigation Drawer in my application and Fragments are used in the app instead of Activities. When I open the drawer, click on an item a Fragment appears. I move from one fragment to another fragment using the following code:

Fragment fragment = null;
fragment = new GalleryFragment(selectetdMainMenu.getCategoryID());
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.addToBackStack("menuFrag");
ft.add(R.id.frame_container, fragment, "menuFrag");
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

In this way I can go from one fragment to another but I fail to come to the previous fragment on back button press. I managed to come up with this code to handle back press in MainActivity where Drawer is Initialized:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_BACK) {
Fragment fragment_byTag = fragmentManager.findFragmentByTag("menuFrag");
Fragment menuFragment_by_tag = fragmentManager.findFragmentByTag("galleryFrag");
Fragment commentsFrag_by_tag = fragmentManager.findFragmentByTag("commentsFrag");
Fragment dealDetail = fragmentManager.findFragmentByTag("promoFrag");
if(commentsFrag_by_tag != null){
if (commentsFrag_by_tag.isVisible()) {
Log.e("comments back ", " clicked");
//menuDetailsFrag.onBackPressed();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().remove(commentsFrag_by_tag).commit();
fragmentManager.beginTransaction().show(menuFragment_by_tag).commit();
}
}else if(menuFragment_by_tag.isVisible()){
Log.e("menu back ", " clicked");
menuDetailsFrag.onBackPressed();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().remove(menuFragment_by_tag).commit();
fragmentManager.beginTransaction().show(fragment_byTag).commit();
}
} return false;
}

This works at times but fails most of the time. I would greatly appreciate if a better way to navigate back can be shown.

I am using Android Sliding Menu using Navigation Drawer in my application and Fragments are used in the app instead of Activities. When I open the drawer, click on an item a Fragment appears. I move from one fragment to another fragment using the following code:

Fragment fragment =null;
fragment =newGalleryFragment(selectetdMainMenu.getCategoryID());FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.addToBackStack("menuFrag");
ft.add(R.id.frame_container, fragment,"menuFrag");
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();

In this way I can go from one fragment to another but I fail to come to the previous fragment on back button press. I managed to come up with this code to handle back press in MainActivity where Drawer is Initialized:

@Overridepublicboolean onKeyDown(int keyCode,KeyEventevent){super.onKeyDown(keyCode,event);if(keyCode ==KeyEvent.KEYCODE_BACK){Fragment fragment_byTag = fragmentManager.findFragmentByTag("menuFrag");Fragment menuFragment_by_tag = fragmentManager.findFragmentByTag("galleryFrag");Fragment commentsFrag_by_tag = fragmentManager.findFragmentByTag("commentsFrag");Fragment dealDetail = fragmentManager.findFragmentByTag("promoFrag");if(commentsFrag_by_tag !=null){if(commentsFrag_by_tag.isVisible()){Log.e("comments back  "," clicked");//menuDetailsFrag.onBackPressed();FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().remove(commentsFrag_by_tag).commit();
fragmentManager.beginTransaction().show(menuFragment_by_tag).commit();}}elseif(menuFragment_by_tag.isVisible()){Log.e("menu back "," clicked");
menuDetailsFrag.onBackPressed();FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().remove(menuFragment_by_tag).commit();
fragmentManager.beginTransaction().show(fragment_byTag).commit();}}returnfalse;}

This works at times but fails most of the time. I would greatly appreciate if a better way to navigate back can be shown.

asked Mar 21 '14 at 7:41
TharakaNirmana

6,22673160
 
    
1  
add this ft.addToBackStack(null);ft.commit(); add the fragments to the backstack and pop them. stackoverflow.com/questions/22550420/… – Raghunandan Mar 21 '14 at 7:45 
    
@Raghunandan. The easiest solution I found is yours. – YuDroid Nov 29 '14 at 12:21

4 Answers

I usually set an onKeyListener to the View in onResume. From what I learned you have to take care to set setFocusableInTouchMode() and requestFocus on the View.

This is a sample of what I use for this purpose:

@Overridepublicvoid onResume(){super.onResume();

    getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(newView.OnKeyListener(){@Overridepublicboolean onKey(View v,int keyCode,KeyEventevent){if(event.getAction()==KeyEvent.ACTION_UP && keyCode ==KeyEvent.KEYCODE_BACK){// handle back buttonreturntrue;}returnfalse;}});}
answered Mar 21 '14 at 8:15
super-qua

2,51211326
 
    
where do I place this code? fragment or main activity> – TharakaNirmana Mar 21 '14 at 8:16
    
The code goes in the fragment. Hope this helps – super-qua Mar 21 '14 at 8:17
    
This worked. I added getActivity().getSupportFragmentManager().popBackStack(); to handle back press. – TharakaNirmana Mar 24 '14 at 5:02
1  
@super-qua, superb solution for fragment – Hiren Patel Nov 26 '14 at 8:54
5  
This will stop working if you have a child view within the fragment that can gain focus. For example if you have a "list state" and "edit state" in the fragment, you go into the "edit state" that has an EditText within it, select the EditText, the main view will lose focus and the onKey() will stop functioning unless you manually regain focus of the base view. – wchristiansen Dec 1 '15 at 21:10

Try these methods. To me, the most useful solution is as follows:

In MainActivity:

getSupportFragmentManager().beginTransaction().replace(R.id.gif_contents, gifPageTwoFragment,"gifPageTwoFragment").addToBackStack("gifPageTwoFragment").commit();

In GifPageTwoFragment:

@Overridepublicvoid onActivityCreated(Bundle savedInstanceState){super.onActivityCreated(savedInstanceState);
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(newView.OnKeyListener(){@Overridepublicboolean onKey(View v,int keyCode,KeyEventevent){if(event.getAction()==KeyEvent.ACTION_UP && keyCode ==KeyEvent.KEYCODE_BACK){Log.e("gif--","fragment back key is clicked");
getActivity().getSupportFragmentManager().popBackStack("gifPageTwoFragment",FragmentManager.POP_BACK_STACK_INCLUSIVE);returntrue;}returnfalse;}});}
answered Aug 21 '15 at 2:09
renhui

5112
 

In your oncreateView() method you need to write this code and in KEYCODE_BACk condition you can write whatever the functionality you want

View v = inflater.inflate(R.layout.xyz, container,false);//Back pressed Logic for fragment
v.setFocusableInTouchMode(true);
v.requestFocus();
v.setOnKeyListener(newView.OnKeyListener(){@Overridepublicboolean onKey(View v,int keyCode,KeyEventevent){if(event.getAction()==KeyEvent.ACTION_DOWN){if(keyCode ==KeyEvent.KEYCODE_BACK){
getActivity().finish();Intent intent =newIntent(getActivity(),MainActivity.class);
startActivity(intent);returntrue;}}returnfalse;}});
answered Mar 21 '16 at 10:32
Raj Kumar

286312
 
    
This was perfect for me – Adi May 18 '16 at 12:41
        view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(newView.OnKeyListener(){@Overridepublicboolean onKey(View v,int keyCode,KeyEventevent){if(keyCode ==KeyEvent.KEYCODE_BACK){FragmentNameofFragment=newNameofFragment;FragmentTransaction transaction=getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container,NameofFragment); transaction.commit();returntrue;}returnfalse;}});return view;

Android Handling back press when using fragments in Android的更多相关文章

  1. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  2. Android中隐藏顶部状态栏的那些坑——Android开发之路3

    Android中隐藏顶部状态栏的那些坑 先看看常规的隐藏状态栏的方法: 方法一: @Override protected void onCreate(Bundle savedInstanceState ...

  3. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  4. android 获取应用的当前版本号&获取当前android系统的版本号

    (转自:http://www.cnblogs.com/qsl568/archive/2012/03/14/2395636.html) 获取当前应用的版本号: private String getVer ...

  5. Xamarin Android.Views.WindowManagerBadTokenException: Unable to add window -- token android.os.BinderProxy

    Android.Views.WindowManagerBadTokenException: Unable to add window -- token android.os.BinderProxy@ ...

  6. java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ProgressBar$SavedState

    java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.Progress ...

  7. Android开发快速入门(环境配置、Android Studio安装)

    Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...

  8. Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力

    [摘要] 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦). [准备篇] Q:何为 NineP ...

  9. Android开发环境搭建全程演示(jdk+eclipse+android sdk)

    全程演示android开发环境的搭建过程,无需配置环境变量.所有软件都是写该文章时最新版本 一 相关下载 (1) java JDK下载: 进入该网页: http://java.sun.com/java ...

随机推荐

  1. Python学习小计

    1.初学Python最好选择2.7版本,因为大部分Python书籍的示例代码是基于这个版本的 2.Python安装可以参考百度经验完成 如果在电脑上同时安装2个版本,则CMD启动时只需要: py -2 ...

  2. struts2学习之基础笔记5

    第十章 Struts 2的输入校验 1 Struts 2 输入校验原理 a . 分类 validate()方法校验 b . validation框架校验 2 valibate()方法校验实现 步骤  ...

  3. [oracle] 组织架构退格显示 connect by

    1. 按组织架构关系退格显示 create or replace view v_vieworg asselect --v.OBJID,v.OBJNAMElevel as levelid, lpad(' ...

  4. MDL的一些理解

    驱动程序要操作一个用户模式下的内存(32位下小于2G),那么是有风险的,因为用户模式下当前进程的线程不断切换,用户模式下的地址可能会无效.这时的操作将会有未知结果. 用MDL系统API可以将用户模式下 ...

  5. Uva 11324 The Largest Clique【强连通 DAG动规 spfa】

    白书上的例题 做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了 #include<cstdio> #include< ...

  6. [置顶] 使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包

    作者:chenzhou123520 出处:http://chenzhou123520.iteye.com/blog/1706242 使用 maven 插件 maven-shade-plugin 对 j ...

  7. Windows 10快速在指定目录打开命令行

    一.我们在想要到达的目录上按住shift键并点击鼠标右键.看到了吗,这时候在弹出菜单里多了一个选项,就是"在此处打开命令窗口",我们点开看一下. 二.不过有时候我们需要以管理员的权 ...

  8. PHP下的异步尝试二:初识协程

    PHP下的异步尝试系列 如果你还不太了解PHP下的生成器,你可以根据下面目录翻阅 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify ...

  9. 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)

    题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...

  10. 利用已有库对excel进行读和写

    读excel的内容:libxls库 C: https://github.com/evanmiller/libxls  或 http://libxls.sourceforge.net/ 参考博客:htt ...