Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在片段中实现onBackPressed并到达HomeFragment?_Android_Android Fragments_Onbackpressed - Fatal编程技术网

Android 如何在片段中实现onBackPressed并到达HomeFragment?

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

我正在使用3个片段(HomeFragment、RegisterFragment和NewsFragment)。当我点击后退按钮时,如何从NewsFragment移动到DirectHomeFragment。当我点击后退按钮时,我不想移动到其他片段。

在新闻片段中:

@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();
    }
}