Android 如何在片段中实现onBackPressed并到达HomeFragment?
我正在使用3个片段(HomeFragment、RegisterFragment和NewsFragment)。当我点击后退按钮时,如何从NewsFragment移动到DirectHomeFragment。当我点击后退按钮时,我不想移动到其他片段。在新闻片段中:Android 如何在片段中实现onBackPressed并到达HomeFragment?,android,android-fragments,onbackpressed,Android,Android Fragments,Onbackpressed,我正在使用3个片段(HomeFragment、RegisterFragment和NewsFragment)。当我点击后退按钮时,如何从NewsFragment移动到DirectHomeFragment。当我点击后退按钮时,我不想移动到其他片段。在新闻片段中: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (Integer.parseInt(android.os.Build.VERSION.SDK
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
onBackPressed();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
HomeFragment f = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_home);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(f);
}
您可能有一个处理所有这些片段替换的活动。在本活动中,如果使用实际显示片段定义变量,则可以重写onBackPressed并检查其是否显示NewsFragment,并将其替换为HomeFragment
@Override
public void onBackPressed() {
if(actualFragment instanceof NewsFragment) {
HomeFragment homeFragment = new HomeFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, homeFragment);
transaction.commit();
}
}
当我按下返回按钮时,这对我有效 我不知道您的
片段
结构,但我使用单个布局
,并将其替换为相应的片段
这是我的密码:
@Override
//Pressed return button - returns to the results menu
public void onResume() {
super.onResume();
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){
frag_name frag_name = new frag_name();
FragmentManager manager = getActivity().getSupportFragmentManager();
manager.beginTransaction().replace(R.id.yourlayout, frag_name, frag_name.getTag()).commit();
return true;
}
return false;
}
});
}
我创建了一个实用类来控制我的片段导航 下面是这个类的外观:
public class FragmentController {
private static final String TAG = FragmentController.class.getCanonicalName();
private static FragmentController mInstance;
private ArrayList<BaseFragment> mFragmentsList;
private BaseActivity mActivity;
private FrameLayout mFragmentContainer;
public FragmentController(BaseActivity activity) {
set(activity);
}
public static FragmentController getInstance(BaseActivity activity) {
if (mInstance == null)
mInstance = new FragmentController(activity);
return mInstance;
}
public static void setInstance(FragmentController mInstance) {
FragmentController.mInstance = mInstance;
}
public void set(BaseActivity activity) {
mActivity = activity;
if (mActivity instanceof MainActivity) {
mFragmentContainer = ((MainActivity) mActivity).getFragmentContainer();
}
mFragmentsList = new ArrayList<>();
}
public void addFirstFragment(BaseFragment fragment) {
mFragmentsList.add(fragment);
}
public void presentFragment(BaseFragment fragment, boolean removeAllFromBackstack) {
try {
Log.d(TAG, "presentFragment: " + fragment.getTagFm());
if (mActivity.getCurrentFocus() != null) {
ViewUtils.hideKeyboard(mActivity.getCurrentFocus());
}
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft.replace(mFragmentContainer.getId(), fragment, fragment.getTagFm());
ft.addToBackStack(fragment.getTagFm());
ft.commitAllowingStateLoss();
if (mFragmentsList.size() != 0)
if (removeAllFromBackstack) {
if (mFragmentsList.size() == 2) {
mFragmentsList.remove(1);
} else if (mFragmentsList.size() > 2) {
mFragmentsList.subList(1, mFragmentsList.size()).clear();
}
}
if (!isFragmentPresent(fragment))
mFragmentsList.add(fragment);
} catch (Exception e) {
e.printStackTrace();
}
}
public void removeSecondFragment() {
mFragmentsList.remove(1);
}
private boolean isFragmentPresent(BaseFragment fragment) {
for (BaseFragment baseFragment : mFragmentsList) {
if (baseFragment.getTagFm().equals(fragment.getTagFm()))
return true;
}
return false;
}
public BaseFragment getCurrentFragment() {
return mFragmentsList.get(mFragmentsList.size() - 1);
}
public ArrayList<BaseFragment> getFragmentsList() {
return mFragmentsList;
}
现在,我通过我的活动
@Override
public void onBackPressed() {
if (mFragmentController.getFragmentsList().size() == 1) {
finish();
}
else {
mFragmentController.getFragmentsList().remove(mFragmentController.getFragmentsList().size() - 1);
mFragmentController.presentFragment(mFragmentController.getFragmentsList().get(mFragmentController.getFragmentsList().size() - 1), false);
}
}
在FragmentController
类中,您将看到im在BaseFragment
类上使用方法getTagFm()
。这基本上是为了识别que中存在的片段和不存在的片段BaseFragment
类将如下所示:
public class BaseFragment extends Fragment {
public String getTagFm() {
if (this.getClass().getSimpleName().equals(LoginFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_LOGIN;
} else if (this.getClass().getSimpleName().equals(OrderFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_ORDER;
} else if (this.getClass().getSimpleName().equals(ProgramFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_PROGRAM;
}
return Constants.TAG_FRAGMENT_ORDER;
}
}
所有这些片段(LoginFragment
,OrderFragment
,ProgramFragment
)扩展到BaseFragment
希望这对某人有所帮助。不要在背压时检查每个片段,而是维护一个堆栈,以跟踪视图层次结构中的每个片段
Stack<Fragment> fragmentStack= new Stack<Fragment>();
// add first fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.container, "your fragment object");
//push it in stack
fragmentStack.push(homeListFragment);
ft.commit();
// add second fragment
ResultListFragment resultListFragment = new ResultListFragment();
ft.add(R.id.container, resultListFragment);
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(resultListFragment);
ft.commit();
//now back button press logic
@Override
public void onBackPressed() {
if (fragmentStack.size() == 2) {
FragmentTransaction ft = fragmentManager.beginTransaction();
fragmentStack.lastElement().onPause();
ft.remove(fragmentStack.pop());
fragmentStack.lastElement().onResume();
ft.show(fragmentStack.lastElement());
ft.commit();
} else {
super.onBackPressed();
}
}
Stack fragmentStack=new Stack();
//添加第一个片段
FragmentManager FragmentManager=getSupportFragmentManager();
FragmentTransaction ft=fragmentManager.beginTransaction();
ft.add(R.id.container,“您的碎片对象”);
//把它叠起来
fragmentStack.push(homeListFragment);
ft.commit();
//添加第二个片段
ResultListFragment ResultListFragment=新的ResultListFragment();
ft.add(R.id.container,resultListFragment);
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(resultListFragment);
ft.commit();
//现在返回按钮按下逻辑
@凌驾
public void onBackPressed(){
if(fragmentStack.size()==2){
FragmentTransaction ft=fragmentManager.beginTransaction();
fragmentStack.lastElement().onPause();
ft.remove(fragmentStack.pop());
fragmentStack.lastElement().onResume();
ft.show(fragmentStack.lastElement());
ft.commit();
}否则{
super.onBackPressed();
}
}
addbackstackto(null)在启动fragmentsave fragment对象时将其作为fragment.isVisible()使用;和管理活动中的片段。有关详细信息,请参见如何设置片段调用。。
Stack<Fragment> fragmentStack= new Stack<Fragment>();
// add first fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.container, "your fragment object");
//push it in stack
fragmentStack.push(homeListFragment);
ft.commit();
// add second fragment
ResultListFragment resultListFragment = new ResultListFragment();
ft.add(R.id.container, resultListFragment);
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(resultListFragment);
ft.commit();
//now back button press logic
@Override
public void onBackPressed() {
if (fragmentStack.size() == 2) {
FragmentTransaction ft = fragmentManager.beginTransaction();
fragmentStack.lastElement().onPause();
ft.remove(fragmentStack.pop());
fragmentStack.lastElement().onResume();
ft.show(fragmentStack.lastElement());
ft.commit();
} else {
super.onBackPressed();
}
}