处理每个片段的反压
Handling backpressed on each fragment
我在 Whosebug 上浏览了很多,并为我的项目做了一组最好的交易,但在处理 backpressed 时遇到问题。
这是我的基地activity class:
public class BaseAppCompatActivity extends LifecycleActivity {
protected IBackPressedListener onBackPressedListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected FragmentTransaction getFragmentTransaction() {
return getSupportFragmentManager().beginTransaction();
}
protected void addFragment(int fragmentContainer, Fragment fragment, String fragName, boolean addToBackStack) {
FragmentTransaction ft = getFragmentTransaction();
ft.add(fragmentContainer, fragment);
if (addToBackStack)
ft.addToBackStack(fragName);
// Complete the changes added above
ft.commitAllowingStateLoss();
}
public void setOnBackPressedListener(IBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
@Override
public void onBackPressed() {
}
@Override
protected void onDestroy() {
super.onDestroy();
onBackPressedListener = null;
}
}
这是我的 activity 类,我在其中添加片段并处理后压事件:
public class RechargeFragmentActivity extends BaseAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recharge_fragment);
/*Replace fragment*/
addFragment(R.id.fragmentFrame, new SelectRechargeOperatorFragment(), AppFragments.FRAG_SELECT_RECHARGE_OPERATORS, true);
}
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1 && onBackPressedListener != null) {
onBackPressedListener.onBackPressed();
} else
finish();
}
}
现在我在片段中实现了 Onbackpressed 侦听器,它对一个反压效果很好,之后它只拾取最后一个被弹出的片段的实例。
public class SelectRechargeOperatorFragment extends BaseFragment {
@Inject
public SelectRechargeOperatorLiveDataModel operatorLiveDataModel;
@BindView(R.id.rv_select_operator)
RecyclerView rvSelectOperators;
@BindView(R.id.proceedLayout)
RelativeLayout btnProceed;
private RechargeOperatorsAdapter adapter;
public SelectRechargeOperatorFragment() {
//empty constructor required
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseAppCompatActivity) fragmentContext).setOnBackPressedListener(this);
}
@Override
protected void onInject(GraphComponent applicationComponent) {
super.onInject(applicationComponent);
applicationComponent.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View convertView = inflater.inflate(R.layout.fragment_select_recharge_operator, container, false);
ButterKnife.bind(this, convertView);
/*fetch-views*/
setUpOperatorRecyclerView();
proceedToRecharge();
return convertView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
}
private void proceedToRecharge() {
btnProceed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addFragment(R.id.fragmentFrame, new RechargeAirtimeFargment(), AppFragments.FRAG_RECHARGE_AIRTIME_PLANS, true);
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
getActivity().getSupportFragmentManager().popBackStack();
}
}
这在我只添加一个片段时效果很好。当我添加多个片段时,它仅适用于第一次弹出片段,然后它 returns 我是旧片段 onBackpressed 侦听器。为什么?
问题是,每次添加片段时,activity 中的 onBackPressedListener
都会被新对象覆盖。所以在弹出最后一个片段之后逻辑失败了。请尝试以下操作。
- 从您的 Activity
中删除 setOnBackPressedListener
和 onBackPressedListener
- 在您的片段中实施
IBackPressedListener
。也许您可以使用 basefragment 来避免代码重复。根据您的需要选择。
将 activity 中的 onBackPressed
更改为
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragmentFrame);
if(null != currentFragment && currentFragment instance of IBackPressedListener) {
((IBackPressedListener)currentFragment).onBackPressed();
}
} else
finish();
}
我在 Whosebug 上浏览了很多,并为我的项目做了一组最好的交易,但在处理 backpressed 时遇到问题。
这是我的基地activity class:
public class BaseAppCompatActivity extends LifecycleActivity {
protected IBackPressedListener onBackPressedListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected FragmentTransaction getFragmentTransaction() {
return getSupportFragmentManager().beginTransaction();
}
protected void addFragment(int fragmentContainer, Fragment fragment, String fragName, boolean addToBackStack) {
FragmentTransaction ft = getFragmentTransaction();
ft.add(fragmentContainer, fragment);
if (addToBackStack)
ft.addToBackStack(fragName);
// Complete the changes added above
ft.commitAllowingStateLoss();
}
public void setOnBackPressedListener(IBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
@Override
public void onBackPressed() {
}
@Override
protected void onDestroy() {
super.onDestroy();
onBackPressedListener = null;
}
}
这是我的 activity 类,我在其中添加片段并处理后压事件:
public class RechargeFragmentActivity extends BaseAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recharge_fragment);
/*Replace fragment*/
addFragment(R.id.fragmentFrame, new SelectRechargeOperatorFragment(), AppFragments.FRAG_SELECT_RECHARGE_OPERATORS, true);
}
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1 && onBackPressedListener != null) {
onBackPressedListener.onBackPressed();
} else
finish();
}
}
现在我在片段中实现了 Onbackpressed 侦听器,它对一个反压效果很好,之后它只拾取最后一个被弹出的片段的实例。
public class SelectRechargeOperatorFragment extends BaseFragment {
@Inject
public SelectRechargeOperatorLiveDataModel operatorLiveDataModel;
@BindView(R.id.rv_select_operator)
RecyclerView rvSelectOperators;
@BindView(R.id.proceedLayout)
RelativeLayout btnProceed;
private RechargeOperatorsAdapter adapter;
public SelectRechargeOperatorFragment() {
//empty constructor required
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseAppCompatActivity) fragmentContext).setOnBackPressedListener(this);
}
@Override
protected void onInject(GraphComponent applicationComponent) {
super.onInject(applicationComponent);
applicationComponent.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View convertView = inflater.inflate(R.layout.fragment_select_recharge_operator, container, false);
ButterKnife.bind(this, convertView);
/*fetch-views*/
setUpOperatorRecyclerView();
proceedToRecharge();
return convertView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
}
private void proceedToRecharge() {
btnProceed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addFragment(R.id.fragmentFrame, new RechargeAirtimeFargment(), AppFragments.FRAG_RECHARGE_AIRTIME_PLANS, true);
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
getActivity().getSupportFragmentManager().popBackStack();
}
}
这在我只添加一个片段时效果很好。当我添加多个片段时,它仅适用于第一次弹出片段,然后它 returns 我是旧片段 onBackpressed 侦听器。为什么?
问题是,每次添加片段时,activity 中的 onBackPressedListener
都会被新对象覆盖。所以在弹出最后一个片段之后逻辑失败了。请尝试以下操作。
- 从您的 Activity 中删除
- 在您的片段中实施
IBackPressedListener
。也许您可以使用 basefragment 来避免代码重复。根据您的需要选择。 将 activity 中的
onBackPressed
更改为@Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 1) { Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragmentFrame); if(null != currentFragment && currentFragment instance of IBackPressedListener) { ((IBackPressedListener)currentFragment).onBackPressed(); } } else finish(); }
setOnBackPressedListener
和 onBackPressedListener