work - set layout fragment android




O fragmento onAttach() do Android foi descontinuado (6)

Atualizei meu aplicativo para usar a biblioteca de suporte mais recente (versão 23.0.0). Descobri que eles preteriram a função onAttach () da classe Fragment.

Ao invés de:

onAttach (Activity activity)

É neve:

onAttach (Context context)

Como meu aplicativo usa a atividade passada antes da depreciação, acho que uma solução possível é:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = getActivity();
}

Essa seria a maneira correta de fazer isso?

ATUALIZAR:

Se eu executar um dispositivo com API menor que 23, o novo onAttach () nem será chamado. Espero que não seja isso que eles pretendam fazer!

ATUALIZAÇÃO 2:

O problema foi resolvido com as atualizações mais recentes do SDK.

Eu testei no meu dispositivo API 22 e onAttach (Context) está sendo chamado.

Clique here para seguir o relatório de erros que abri há algumas semanas e as respostas dos funcionários do Google.


A resposta abaixo está relacionada a este aviso de descontinuação que ocorre no tutorial Fragmentos no site do desenvolvedor do Android e pode não estar relacionado às postagens acima.

Eu usei esse código na lição do tutorial e funcionou.

public void onAttach(Context context){
    super.onAttach(context);

    Activity activity = getActivity();

Eu estava preocupado que a atividade talvez fosse nula como afirma a documentação.

getActivity

FragmentActivity getActivity () Retorne a FragmentActivity à qual este fragmento está associado atualmente. Pode retornar nulo se o fragmento estiver associado a um contexto.

Mas o onCreate na main_activity mostra claramente que o fragmento foi carregado e, após esse método, chamar a atividade get do fragmento retornará a classe main_activity.

getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();

Espero estar certo com isso. Eu sou um novato absoluto.


Atividade é um contexto, portanto, se você pode simplesmente verificar se o contexto é uma Atividade e transmiti-lo, se necessário.

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity a;

    if (context instanceof Activity){
        a=(Activity) context;
    }

}

Atualização: alguns estão alegando que a nova substituição de Context nunca é chamada. Eu fiz alguns testes e não consigo encontrar um cenário em que isso seja verdade e, de acordo com o código-fonte, nunca deve ser verdade. Em todos os casos que testei, antes e depois do SDK23, as versões Activity e Context do onAttach foram chamadas. Se você puder encontrar um cenário em que esse não seja o caso, sugiro que você crie um projeto de amostra ilustrando o problema e relate à equipe do Android .

Atualização 2: só uso os fragmentos da Biblioteca de Suporte Android, pois os bugs são corrigidos mais rapidamente lá. Parece que o problema acima, em que as substituições não são chamadas corretamente, só vem à tona se você usar os fragmentos da estrutura.


Baixe a mais nova biblioteca de suporte com o gerenciador sdk e inclua

// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    _onAttach(activity);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    _onAttach(context);
}

private void _onAttach(Context context) {
    // do your real stuff here
}

no gradle.app e defina a versão de compilação como api 23


Embora pareça que na maioria dos casos é suficiente ter onAttach(Context) , existem alguns telefones (por exemplo: Xiaomi Redme Note 2) em que não está sendo chamado, portanto, causa NullPointerExceptions. Portanto, para garantir a segurança, sugiro deixar o método obsoleto também:

compile 'com.android.support:appcompat-v7:23.1.1'

Se você usar os fragmentos da estrutura e a versão do SDK do dispositivo for menor que 23, o OnAttach(Context context) não será chamado.

Em vez disso, uso fragmentos de suporte, para que a depreciação seja corrigida e onAttach(Context context) sempre seja chamado.


você provavelmente está usando android.support.v4.app.Fragment . Para isso, em vez do método onAttach , use getActivity() para obter o FragmentActivity ao qual o fragmento está associado. onAttach(Context context) você poderia usar o onAttach(Context context) .





android-fragments