①先定义接口BackHandleInterface
public interface BackHandleInterface {
void onSelectedFragment(BackHandleFragment backHandleFragment);
}
②定义公用的Fragment
public abstract class BackHandleFragment extends Fragment {
private BackHandleInterface backHandleInterface;
/**
* 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
* FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件
* 如果没有Fragment消息时FragmentActivity自己才会消费该事件
*/
public abstract boolean onBackPressed();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getActivity() instanceof BackHandleInterface){
this.backHandleInterface = (BackHandleInterface)getActivity();
}else{
throw new ClassCastException(getActivity().getClass().getName()+" must implement BackHandledInterface");
}
}
@Override
public void onStart() {
super.onStart();
backHandleInterface.onSelectedFragment(this);
}
}
③需要实现监听的Fragment的Activity实现接口 主要的是onSelectedFragment()和onBackPressed()其他方法可以忽略
public class EdittextActivity extends AppCompatActivity implements BackHandleInterface {
private BackHandleFragment backHandleFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
addFragment(R.id.fragmentContainer, new EdittextFragment());
}
public void addFragment(int containerViewId, Fragment fragment){
final FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction();
transaction.add(containerViewId, fragment);
transaction.commit();
}
@Override
public void onSelectedFragment(BackHandleFragment backHandleFragment) {
this.backHandleFragment = backHandleFragment;
}
@Override
public void onBackPressed() {
if(backHandleFragment == null || !backHandleFragment.onBackPressed()){
if(getSupportFragmentManager().getBackStackEntryCount() == 0){
super.onBackPressed();
}else{
getSupportFragmentManager().popBackStack();
}
}
}
}
④需要监听的Fragment
public class EdittextFragment extends BackHandleFragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_edittext, container, false);
return view;
}
@Override
public boolean onBackPressed() {
Toast.makeText(getActivity(), "按了返回键", Toast.LENGTH_SHORT).show();
return true;
}
}