Подтвердить что ты не робот

Использование onBackPressed() в Android-фрагментах

Я работаю над проектом, и мне нужно иметь возможность использовать обратную кнопку в каждом фрагменте для перемещения между предыдущими фрагментами, у меня есть методы, написанные для этого, используя обратную стрелку на панели действий, однако я хочу чтобы иметь возможность использовать те же функции на задней кнопке. Я не хочу использовать задний стек. Есть ли способ сделать это?

ИЗМЕНИТЬ

Вместо того, чтобы использовать задний стек, я хочу, чтобы вы могли вернуться к предыдущему методу ниже, когда пользователь нажимает кнопку "Назад". Мне нужно использовать метод 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(). Это имеет смысл?

4b9b3361

Ответ 1

Почему вы не хотите использовать задний стек? Если есть основная проблема или путаница, возможно, мы сможем расчистить ее для вас.

Если вы хотите придерживаться своего требования, просто переопределите метод 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

Я не нашел хорошего ответа об этой проблеме, так что это мое решение.

Если вы хотите получить обратную запись в каждом фрагменте, сделайте следующее.

создать интерфейс 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();
           }
        }
    }
}

Ответ 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;
    }
};

Ответ 4

Вы можете попробовать переопределить onCreateAnimation, параметр и catch 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);
    }

Ответ 5

Для фрагмента можно просто добавить

  getActivity().onBackPressed();

к вашему коду

Ответ 6

Используйте это:

@Override
public void onBackPressed() {
    int fragments = getFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
        finish();
    }
    super.onBackPressed();
}