我正在开发一个项目,我需要能够使用每个片段中的后退按钮在之前的片段之间导航,我有使用操作栏中的后退箭头编写的方法,但是,我想要能够在按下的后退按钮上使用相同的功能。我不想使用后台堆栈。有没有办法做到这一点?
修改
当用户点击后退按钮时,我希望能够调用返回上面的方法,而不是使用后台堆栈。我需要在片段中使用gobackpressed方法。这可能吗?我希望这清楚而简洁。对上面引起的任何混淆道歉。
返回上一页
public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out);
ft.show(preFragment);
//**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK**
ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag));
ft.addToBackStack(null);
ft.commit();
Misc.currentContentFragmentTag = preFragmentTag;
createBar(preFragment);
}
前进
public void gotoNextFragment(String nextTag, Fragment nextFragment){
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out);
boolean newlyCreated = false;
if(nextFragment == null){
nextFragment = Fragment.instantiate(this, nextTag);
newlyCreated = true;
}
//hide current fragment
ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag));
if(newlyCreated){
ft.add(R.id.content_frame, nextFragment, nextTag);
}
else{
ft.show(nextFragment);
}
ft.addToBackStack(null);
ft.commit();
Misc.currentContentFragmentTag = nextTag;
createBar(nextFragment);
}
这些是我来回导航的方式,我希望能够在onBackPressed()上实现go back方法。这有意义吗?
答案 0 :(得分:33)
我没有找到关于这个问题的任何好答案,所以这是我的解决方案。
如果要在每个片段中获取backPress,请执行以下操作。
创建界面OnBackPressedListener
public interface OnBackPressedListener {
void onBackPressed();
}
希望获得backPress
通知的每个片段都会实现此界面。
在父活动中,您可以覆盖onBackPressed()
@Override
public void onBackPressed() {
List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
if (fragmentList != null) {
//TODO: Perform your logic to pass back press here
for(Fragment fragment : fragmentList){
if(fragment instanceof OnBackPressedListener){
((OnBackPressedListener)fragment).onBackPressed();
}
}
}
}
答案 1 :(得分:21)
为什么不想使用后台?如果存在潜在的问题或混淆,我们可以为您清理它。
如果你想坚持你的要求,只需覆盖你的Activity的onBackPressed()方法,并在点击ActionBar中的后退箭头时调用你正在调用的任何方法。
编辑:如何解决“黑屏”片段后栈问题:您可以通过向片段管理器添加backstack侦听器来解决该问题。该侦听器检查片段后备堆栈是否为空并相应地完成活动:
您可以在Activity的onCreate方法中设置该侦听器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if(getFragmentManager().getBackStackEntryCount() == 0) finish();
}
});
}
答案 2 :(得分:3)
在您要处理后退按钮的片段中,您应该在oncreateview中将内容附加到您的视图中
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.second_fragment, container, false);
v.setOnKeyListener(pressed);
return v;
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if( keyCode == KeyEvent.KEYCODE_BACK ){
// back to previous fragment by tag
myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG);
if(fragment != null){
(getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit();
}
return true;
}
return false;
}
};
答案 3 :(得分:2)
您可以尝试覆盖onCreateAnimation
,参数并抓住enter==false
。这会在每次背压前触发。
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if(!enter){
//leaving fragment
Log.d(TAG,"leaving fragment");
}
return super.onCreateAnimation(transit, enter, nextAnim);
}
答案 4 :(得分:2)
对于片段,您只需添加
即可 getActivity().onBackPressed();
代码
答案 5 :(得分:1)
这对我有用:D
@Override
public void onResume() {
super.onResume();
if(getView() == null){
return;
}
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
// handle back button's click listener
return true;
}
return false;
}
});}
答案 6 :(得分:1)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Log.w("a","")
}
})
答案 7 :(得分:0)
我找到了没有界面的新方法。您只需将以下代码添加到片段的onCreate()方法:
//overriding the fragment's oncreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//calling onBackPressedDispatcher and adding call back
requireActivity().onBackPressedDispatcher.addCallback(this) {
//do stuff here
}
}
答案 8 :(得分:-6)
使用此:
@Override
public void onBackPressed() {
int fragments = getFragmentManager().getBackStackEntryCount();
if (fragments == 1) {
finish();
}
super.onBackPressed();
}