android 获取当前fragment单个对象(解决fragment返回键问题)

来源:互联网 发布:网页游戏编程入门 编辑:程序博客网 时间:2024/06/08 06:14

在做fragment返回的时候,因为fragment里不能直接写onKeyDown方法,所以只能在fragmentactivity里操作(我的fragment都是依附在fragmentactivity上的,通过tabhost显示出来)。在这边有两种方法:
方法一:在这边只要获取到当前的fragment单个对象就可以实现了,再用instanceof进行判断是哪个fragment。
贴代码:

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);//realtabcontent为你的容器,装载fragment的if (ft instanceof HomeFragment || ft instanceof PersonalFragment) {if ((System.currentTimeMillis() - mExitTime) > 2000) {Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();mExitTime = System.currentTimeMillis();} else {finish();}return true;} else if (ft instanceof LoginFragment) {((LoginFragment) ft).onKeyDown(keyCode, event);//onKeyDown在LoginFragment里面重写了,只是随便写了一个方法而已.......return false;} else if (ft instanceof RegisterFragment) {((RegisterFragment) ft).onKeyDown(keyCode, event);return false;}}return super.onKeyDown(keyCode, event);}

方法二:自定义一个BackHandledFragment,在写一个BackHandledInterface接口,通过这个接口,可以调用BackHandledFragment里面的ononBackPressed()。
BackHandledFragment.java

package com.example.demo.fragment;import com.example.sihaiproject.interfaces.BackHandledInterface;import android.os.Bundle;import android.support.v4.app.Fragment;public abstract class BackHandledFragment extends Fragment {protected BackHandledInterface mBackHandledInterface;/*** 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑* FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件* 如果没有Fragment消息时FragmentActivity自己才会消费该事件*/public abstract boolean onBackPressed();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(!(getActivity() instanceof BackHandledInterface)){throw new ClassCastException("Hosting Activity must implement BackHandledInterface");}else{this.mBackHandledInterface = (BackHandledInterface)getActivity();}}@Overridepublic void onStart() {super.onStart();//告诉FragmentActivity,当前Fragment在栈顶mBackHandledInterface.setSelectedFragment(this);}}BackHandledInterface.javapackage com.example.demo.interfaces;import com.example.sihaiproject.fragment.BackHandledFragment;public interface BackHandledInterface {public abstract void setSelectedFragment(BackHandledFragment selectedFragment);}

在你的fragment中声明一个private boolean hadIntercept;,然后重写

@Overridepublic boolean onBackPressed() {if(hadIntercept){return false;}else{getFragmentManager().popBackStack();hadIntercept = true;return true;}}

在fragmentactivity声明private BackHandledFragment mBackHandedFragment;,然后重写setSelectedFragment方法:

@Overridepublic void setSelectedFragment(BackHandledFragment selectedFragment) {this.mBackHandedFragment = selectedFragment;}

重写fragmentactivity里的onBackPressed方法:

@Overridepublic void onBackPressed() {if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) {if (getSupportFragmentManager().getBackStackEntryCount() == 0) {finish();} else {getSupportFragmentManager().popBackStack();}}}

ok!这就是所有的代码了,直接复制到项目里就可以的。
主要是Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);,这句话的作用就是获取当前fragment对象。
也可以通过findfragmentbyid或findfragmentbttag来获取。
onKeyDown和onBackPressed虽然都有返回的作用,但是他们是有区别的。

0 0
原创粉丝点击