Жизненный цикл фрагмента при использовании в view pager

#android #android-fragments #android-viewpager #android-tablayout

#Android #android-фрагменты #android-viewpager #android-tablayout

Вопрос:

В ViewPager с TableLayout у меня есть 5 фрагментов. Я нажимаю на фрагмент-3, setUserVisibleHint = true . Button при нажатии на фрагмент-3 замените или добавьте другой фрагмент. Не происходит никаких событий во фрагменте-3 при нажатии назад. Я хочу выполнить какое-то действие, когда пользователь нажимает назад.

  public class ThreeFragment extends Fragment {

    public ThreeFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @return A new instance of fragment BlankFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static ThreeFragment newInstance() {
        ThreeFragment fragment = new ThreeFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("onResume", "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("onPause", "onPause");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Log.d("onCreateView", "onCreateView");
        View view = inflater.inflate(R.layout.fragment_three, container, false);
        view.findViewById(R.id.txt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fragmentManager2 = getFragmentManager();
                FragmentTransaction fragmentTransaction2 = fragmentManager2.beginTransaction();
                BlankFragment fragment2 = BlankFragment.newInstance();
                fragmentTransaction2.addToBackStack("abc");
                fragmentTransaction2.add(android.R.id.content, fragment2);
                fragmentTransaction2.commit();
            }
        });
        return view;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Log.d("setUserVisibleHint", "setUserVisibleHint :: "   isVisibleToUser);
    }
}
  

Новый фрагмент :

 public class BlankFragment extends Fragment {


    public BlankFragment() {
        // Required empty public constructor
    }

    // TODO: Rename and change types and number of parameters
    public static BlankFragment newInstance() {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }
}
  

Комментарии:

1. вы имеете в виду, что у вас есть кнопка на фрагменте-3, и когда пользователь нажимает на это, но затем он переходит к другому фрагменту? затем вы хотите, чтобы, когда пользователь нажимает кнопку «Назад» в новом фрагменте, он возвращался к фрагменту-3?

2. Откройте новый фрагмент и выполните обратную навигацию. При возврате из нового фрагмента фрагмент-3 не получает никакого события жизненного цикла для идентификации того, что фрагмент-3 теперь виден

3. теперь я понимаю вас, пожалуйста, поделитесь фрагментом-3 и новым кодом фрагмента, чтобы мне было легко вам помочь

4. Я добавил код, братан.

Ответ №1:

вы можете легко справиться с этим в новом фрагменте

 fragment.getView().setFocusableInTouchMode(true);
fragment.getView().requestFocus();
fragment.getView().setOnKeyListener( new OnKeyListener()
{
   @Override
   public boolean onKey( View v, int keyCode, KeyEvent event )
{
    if( keyCode == KeyEvent.KEYCODE_BACK )
    {
        //do what you wnt to do when the user prees back
        return true;
    }
    return false;
}
} );
  

перед возвратом true; делайте то, что вы хотите сделать, когда пользователь нажимает «Назад»
и вы можете использовать

 getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
  

чтобы скрыть последний фрагмент и показать предыдущий

Комментарии:

1. Братан. если бы там была только одна навигация, я мог бы с этим справиться. Но есть много переходов к разным фрагментам. Я опубликовал только для примера

2. что вы хотите сделать именно при нажатии кнопки «Назад»?

3. Список транзакций необходимо обновлять и другие обновления пользовательского интерфейса, каждый раз при повторном нажатии.

4. просто скопируйте метод OnKey для всего вашего фрагмента и обновите пользовательский интерфейс, как вам нравится, в каждом нажатом фрагменте