android - activity - error not attached to a context




java.lang.IllegalStateException: fragmento não anexado à atividade (8)

Eu raramente recebo esse erro ao fazer uma chamada de API.

java.lang.IllegalStateException: Fragment  not attached to Activity

Eu tentei colocar o código dentro do método isAdded() para verificar se o fragmento está atualmente adicionado à sua atividade, mas ainda assim raramente recebo esse erro. Não consigo entender por que ainda estou recebendo esse erro. Como posso evitá-lo?

Está mostrando erro na linha

cameraInfo.setId(getResources().getString(R.string.camera_id));

Abaixo está o exemplo de chamada da API que estou fazendo.

SAPI.getInfo(getActivity(),
                new APIResponseListener() {
                    @Override
                    public void onResponse(Object response) {


                        cameraInfo = new SInfo();
                        if(isAdded()) {
                            cameraInfo.setId(getResources().getString(R.string.camera_id));
                            cameraInfo.setName(getResources().getString(R.string.camera_name));
                            cameraInfo.setColor(getResources().getString(R.string.camera_color));
                            cameraInfo.setEnabled(true);
                        }


                    }

                    @Override
                    public void onError(VolleyError error) {
                        mProgressDialog.setVisibility(View.GONE);
                        if (error instanceof NoConnectionError) {
                            String errormsg = getResources().getString(R.string.no_internet_error_msg);
                            Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
                        }
                    }
                });

Às vezes, essa exceção é causada por um erro na implementação da biblioteca de suporte. Recentemente, tive que fazer o downgrade de 26.1.0 para 25.4.0 para me livrar dele.


Adotei a seguinte abordagem para lidar com esse problema. Criou uma nova classe que atua como invólucro para métodos de atividade como este

public class ContextWrapper {
    public static String getString(Activity activity, int resourceId, String defaultValue) {
        if (activity != null) {
            return activity.getString(resourceId);
        } else {
            return defaultValue;
        }
    }

    //similar methods like getDrawable(), getResources() etc

}

Agora, onde quer que eu precise acessar recursos de fragmentos ou atividades, em vez de chamar diretamente o método, eu uso essa classe. Caso o context da atividade não seja null ele retornará o valor do ativo e, caso o context seja nulo, passará um valor padrão (que também é especificado pelo responsável pela chamada da função).

Importante Esta não é uma solução, é uma maneira eficaz de lidar com essa falha normalmente. Você deseja adicionar alguns logs nos casos em que você está obtendo uma instância de atividade como nula e tentar corrigir isso, se possível.


Encontrei Solução muito simples O método isAdded() , que é um dos métodos de fragmento para identificar se esse fragmento atual está anexado à sua atividade ou não.

podemos usar isso como em qualquer lugar na classe de fragmentos, como:

if(isAdded())
{

// using this method, we can do whatever we want which will prevent   **java.lang.IllegalStateException: Fragment not attached to Activity** exception.

}

Esse problema ocorre sempre que você chama um contexto indisponível ou nulo quando o chama. Pode ser uma situação quando você está chamando o contexto do segmento de atividade principal em um segmento de segundo plano ou o contexto do segmento de segundo plano no segmento de atividade principal.

Por exemplo, atualizei minha sequência de preferências compartilhadas como a seguir.

editor.putString("penname",penNameEditeText.getText().toString());
editor.commit();
finish();

E chamou finish () logo depois. Agora, o que ele faz é que, como commit, execute no thread principal e interrompa qualquer outro commit do Async, se chegar até ele terminar. Portanto, seu contexto permanece ativo até a gravação ser concluída. Portanto, o contexto anterior está ativo, causando o erro.

Portanto, verifique seu código novamente se houver algum código com esse problema de contexto.


Este erro pode ocorrer se você estiver instanciando um fragmento que de alguma forma não possa ser instanciado:

Fragment myFragment = MyFragment.NewInstance();


public classs MyFragment extends Fragment {
  public void onCreate() {
   // Some error here, or anywhere inside the class is preventing it from being instantiated
  }
}

No meu caso, eu encontrei isso quando tentei usar:

private String loading = getString(R.string.loading);

O ciclo de vida do fragmento é muito complexo e cheio de erros, tente adicionar:

Activity activity = getActivity(); 
if (isAdded() && activity != null) {
...
}

posso estar atrasado, mas posso ajudar alguém ... A melhor solução para isso é criar uma instância de classe de aplicativo global e chamá-la no fragmento específico em que sua atividade não está sendo anexada

como abaixo

icon = MyApplication.getInstance().getString(R.string.weather_thunder);

Aqui está a classe da aplicação

public class MyApplication extends Application {

    private static MyApplication mInstance;
    private RequestQueue mRequestQueue;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }
}

Exceção: java.lang.IllegalStateException: Fragment

DeadlineListFragment {ad2ef970} não anexado à Atividade

Categoria: Ciclo de vida

Descrição : ao executar uma operação demorada no encadeamento em segundo plano (por exemplo, AsyncTask), um novo fragmento foi criado nesse meio tempo e foi desanexado para a Atividade antes da conclusão do encadeamento em segundo plano. O código no thread da interface do usuário (por exemplo, onPostExecute) chama um fragmento desanexado, lançando essa exceção.

Solução de correção:

  1. Cancele o encadeamento em segundo plano ao pausar ou parar o fragmento

  2. Use isAdded () para verificar se o fragmento está anexado e, em seguida, para getResources () da atividade.





illegalstateexception