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

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

@Override
public 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();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if(!(getActivity() instanceof BackHandledInterface)){
throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
}else{
this.mBackHandledInterface = (BackHandledInterface)getActivity();
}
}

@Override
public void onStart() {
super.onStart();
//告诉FragmentActivity,当前Fragment在栈顶
mBackHandledInterface.setSelectedFragment(this);
}

}
BackHandledInterface.java
package com.example.demo.interfaces;
import com.example.sihaiproject.fragment.BackHandledFragment;
public interface BackHandledInterface {
public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
}

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

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

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

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

重写fragmentactivity里的onBackPressed方法:

@Override
public 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虽然都有返回的作用,但是他们是有区别的。

你可能感兴趣的:(小问题/技巧)