1、Fragment回退栈管理
Activity是由任务栈管理的,遵循先进后出的原则,Fragment也可以实现类似的栈管理,从而实现多个Fragment先后添加后可以返回上一个Fragment,当activity容器内没有Fragment时回退则退出Activity。
具体方法:FragmentTransaction.addToBackStack(String) // 通常传入null即可
代码如下:
Fragment f = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ftx = fm.beginTransaction();
ftx.replace(R.id.fragment_container, f, "tag");
ftx.addToBackStack(null);
ftx.commit();
注:
1.activity的第一个Fragment(根Fragment)可以不添加回退栈,这样最后一个Fragment按返回时就不会空白而是直接退出activity。
2.调用addToBackStack(null)将当前的事务添加到了回退栈,调用replace方法后Fragment实例不会被销毁,但是视图层次会被销毁,即会调用onDestoryView和onCreateView。若需保存当前fragment视图状态,则可以使用hide后add新的Fragment
2、Fragment与Activity通信
通用方式:
Activity调用Fragment方法:如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
Fragment调用Activity方法:在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作
推荐方式:
1.接口(Fragment返回数据给Activity)
Fragment部分代码:
public class TestFragment extends Fragment {
private OnSaveListener listener;
public void setListener(OnSaveListener listener) {
this.listener = listener;
}
public interface OnSaveListener {
void onSaveFinished(boolean result);
void onSaveStart();
}
@OnClick(R.id.btn_save)
public void save() {
....
listener.onSaveFinished(true);
}
}
Activity部分代码:
TestFragment f = new TestFragment();
f.setListener(new ShowCheckFragment.OnSaveListener() {
@Override
public void onSaveFinished(boolean result) {
......
}
@Override
public void onSaveStart() {
......
}
});
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, f);
fragmentTransaction.commit();
2.Fragment Arguments(传递数据到Fragment中)
Fragment部分代码:
ublic class TestFragment extends Fragment
{
private String mArgument;
public static final String ARGUMENT = "argument";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null)
mArgument = bundle.getString(ARGUMENT);
}
/**
* 传入需要的参数,设置给arguments
* @param argument
* @return
*/
public static TestFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
TestFragment f = new TestFragment();
f.setArguments(bundle);
return f;
}
3、Fragment重叠问题
当屏幕旋转或者内存重启(Fragment以及容器activity被系统回收后再打开时重新初始化)会导致Fragment重叠问题,是因为activity本身重启的时候会恢复Fragment,然后创建Fragment的代码又会新建一个Fragment的原因。
解决方法:在onCreate方法中判断参数Bundle savedInstanceState,为空时初始化Fragment实例,然后在Fragment中通过onSaveInstanceState的方法恢复数据
Activity代码:
private TestFragment f;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+"");
if(savedInstanceState == null)
{
f = new TestFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, f, "ONE");
tx.commit();
}
}
网友评论