Como implementar o onBackPressed() em Fragmentos?

Existe alguma forma de implementarmos onBackPressed() no Fragmento Android semelhante à forma como implementamos na atividade Android?

Como o ciclo de vida do fragmento não tem onBackPressed(). Existe algum outro método alternativo para percorrer mais de 'onBackPressed()` em fragmentos do Android 3.0?

De acordo com @HaMMeRed a resposta aqui é pseudocódigo como deve funcionar. Vamos dizer que sua atividade principal se chama `BaseAtividade', que tem fragmentos de crianças (como no exemplo de SlidingMenu lib). Aqui estão os passos:

Primeiro precisamos criar uma interface e classe que implemente sua interface para ter um método genérico

  1. Criar interface de classe 'OnBackPressedListener'.

    interface pública OnBackPressedListener {
        vazio público doBack();
    }
  2. Criar classe que implemente habilidades de 'OnBackPressedListener'.

    classe pública BaseBackPressedListener implementa OnBackPressedListener {
        atividade particular final FragmentoAtividade;
    
        Public BaseBackPressedListener(FragmentActivity activity) {
            esta.actividade = actividade;
        }
    
        @Override
        vazio público doBack() {
            activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }
  3. Desde agora, vamos trabalhar no nosso código "BaseActividade" e nos seus fragmentos.

  4. Crie um ouvinte privado no topo da sua classe "BaseActividade".

    OnBackPressedListener onBackPressedListener protegido;
  5. criar método para definir o ouvinte em "BaseActividade".

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
        this.onBackPressedListener = onBackPressedListener;
    }
  6. em override onBackPressed implemente algo como isso

    @Override
    vazio público onBackPressed() {
        se (onBackPressedListener != nulo)
            onBackPressedListener.doBack();
        mais
            super.onBackPressed();
  7. No seu fragmento em onCreateView você deve adicionar o nosso ouvinte

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        atividade = getActivity();
    
        ((BaseActividade)actividade).setOnBackPressedListener(nova BaseBackPressedListener(actividade));
    
        Ver vista = ... ;
    //colha com vista
    
        vista de retorno;
    }

Voila, agora quando você clica de volta no fragmento, você deve pegar seu método personalizado de volta.

Comentários (6)

Se você queria esse tipo de funcionalidade você precisaria substituí-la na sua atividade, e então adicionar uma interface 'YourBackPressed' a todos os seus fragmentos, que você chama no fragmento relevante sempre que o botão voltar é pressionado.

Edit: I'gostaria de anexar a minha resposta anterior.

Se eu fosse fazer isso hoje, I'usaria uma transmissão, ou possivelmente uma transmissão ordenada se eu esperasse que outros painéis fossem atualizados em uníssono com o painel de conteúdo principal/main.

LocalBroadcastManager` na Biblioteca de Suporte pode ajudar com isso, e você apenas envia a transmissão em onBackPressed e assina em seus fragmentos que se importam. Eu acho que o Messaging é uma implementação mais desacoplada e que escalaria melhor, por isso seria a minha recomendação oficial de implementação agora. Basta utilizar a ação Intent's como um filtro para sua mensagem. envie sua recém-criada ACTION_BACK_PRESSED, envie-a de sua atividade e escute-a nos fragmentos relevantes.

Comentários (7)

Basta adicionar addToBackStack enquanto você está fazendo a transição entre seus fragmentos, como abaixo:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();

se você escrever addToBackStack(null) , ele vai lidar com isso sozinho, mas se você der uma tag , você deve lidar com isso manualmente.

Comentários (3)