[英]Navigating through Fragments in android without adding it into backstack
[英]Adding Fragments to backstack
我试图通过按下单选按钮时切换片段来管理单个活动上的片段。 在每个替换操作中,我都调用addToBackStack()
方法,但是当我按下“后退”按钮时,它将关闭活动,而不是转到上一个片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_flow);
radioGroup = (RadioGroup) findViewById(R.id.rdoGrp);
rdBtnHome = (RadioButton) findViewById(R.id.rdBtnHome);
rdBtnSearch = (RadioButton) findViewById(R.id.rdBtnSearch);
rdBtnShoot = (RadioButton) findViewById(R.id.rdBtnShoot);
rdBtnUser = (RadioButton) findViewById(R.id.rdBtnUser);
rdBtnAlarm = (RadioButton) findViewById(R.id.rdBtnAlarm);
homeFragment = new HomeFragment();
searchFragment = new SearchFragment();
userFragment = new UserFragment();
shootFragment = new ShootFragment();
alarmFragment = new AlarmFragment();
getSupportActionBar().setDisplayOptions(android.support.v7.app.ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.actionbar);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frameLayoutMain, homeFragment);
ft.addToBackStack(null);
ft.commit();
rdBtnHome.setChecked(true);
// Creating once image loader configuration
createImageLoaderConfiguration();
// Defining footer radiogroup including radiogroup callback listener
defineFooterRadioGroup();
Log.d("Logged User", Me.meGetInstance().toString());
}
private void defineFooterRadioGroup() {
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
switch (checkedId) {
case R.id.rdBtnHome:
ft.replace(R.id.frameLayoutMain, homeFragment);
ft.addToBackStack(null);
ft.commit();
break;
case R.id.rdBtnAlarm:
ft.replace(R.id.frameLayoutMain, alarmFragment);
ft.addToBackStack(null);
ft.commit();
break;
case R.id.rdBtnSearch:
ft.replace(R.id.frameLayoutMain, searchFragment);
ft.addToBackStack(null);
ft.commit();
break;
case R.id.rdBtnShoot:
ft.replace(R.id.frameLayoutMain, shootFragment);
ft.addToBackStack(null);
ft.commit();
break;
case R.id.rdBtnUser:
ft.replace(R.id.frameLayoutMain, userFragment);
ft.addToBackStack(null);
ft.commit();
break;
}
}
});
}
像这样向活动的BackPressed侦听器中添加popBackStack()
。
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
这是一种使用片段中的代码删除片段的方法。
public void removeMe() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prevHistory = getFragmentManager()
.findFragmentByTag("LOG_IN");
if (prevHistory != null) {
ft.remove(prevHistory);
}
ft.commit();
}
您需要调用removeMe方法。 因此,将“键侦听器”添加到“后退”按钮。
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
removeMe();
}
return true;
}
});
视图可以是任何东西。 如果需要全局解决方案,则该视图为片段的视图。
为了使此方法有效,您需要在添加或替换片段时向片段事务添加标签。
Fragment newFragment = new Fragment();
ft.replace(R.id.fragment_container, newFragment, "The fragment tag goes here");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.