需求:从fragmentA到fragmentB ,在fragmentB页面编辑之后,返回fragmentA ,默认不会重新加载fragmentA ,这里需要加载新数据
解决方法
1. 输出fragment生命周期,返回后没有输出,说明不能通过生命周期来加载新数据
2. 重写onBackPressed事件,尝试成功
主要代码
在Activity中
@Override
public void onBackPressed() {
super.onBackPressed();
final FragmentA fragment = (FragmentA) getSupportFragmentManager()
.findFragmentByTag("fragment_a");
if (fragment != null) {
fragment.onBackPressed();
}
}
在FragmentB
public void onBackPressed() {
//这里写返回逻辑,我写的是跳转到FragmentA
}
遇到fragment为空的问题,因为findFragmentByTag找不到那个fragment,需要添加进去。又因为fragment不能重复add,所以要做个判断
这里是从FragmentA跳转到FragmentB的代码
FragmentB newFragment = new FragmentB();
newFragment.newInstance(1, MainActivity.this);
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
FragmentB fragment = (FragmentB) getSupportFragmentManager()
.findFragmentByTag("fragment_a");
if (fragment == null) {
transaction.add(newFragment, "fragment_a");
}
transaction.replace(R.id.fragment_a, newFragment);
transaction.addToBackStack(null);
transaction.commit();
另外,如果用findFragmentById,需要在MainActivity的layout文件中添加fragmentB,然后add要不然找不到
网上说的还有一种方法,试了下没有起作用,还没弄明白,代码如下
getView().setOnKeyListener( new OnKeyListener()
{
@Override
public boolean onKey( View v, int keyCode, KeyEvent event )
{
if( keyCode == KeyEvent.KEYCODE_BACK )
{
Toast.makeText(getActivity(),"Clicked", Toast.LENGTH_SHORT).show();
}
return false;
}
} );
参考:
http://stackoverflow.com/questions/7992216/android-fragment-handle-back-button-press
http://stackoverflow.com/questions/15525111/getsupportfragmentmanager-findfragmentbyid-returns-null