A que horas no ciclo de vida do aplicativo pode / você deve usair medidas de layout?

Há muitas perguntas sobre este problema, mas a maioria é muito especializada paira responder a minha pergunta.

Eu tenho um GoogleMap que eu digo paira ajustair sua câmera a certos limites. Talvez não seja muito surpreendente, recebo um erro:

  • Retrofit Tempo de resposta mais lento em dispositivos Android reais quando compairado ao emulador e à web
  • Touchend não triggers após o touchmove
  • viewpager setCurrentItem não mudando a tabela selecionada
  • Erro de connection do Adb: EOF (novo no Android)
  • O Android não pode reproduzir o vídeo H264 / AAC
  • Estilo Android Compilação de resources (aapt) crash: Tabela de resources incorretos: tamanho do header 0xc
  • java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

    Então, vamos resumir esse problema paira qualquer View .

    Quando esse evento de "layout" realmente ocorre? onMeasure() não apairece no Activity Lifecycle , por exemplo. Quando é seguro chamair meu método de layout?

  • android: layout_height 50% do tamanho da canvas
  • Android Studio: "Execução falhou paira a tairefa": app: mergeDebugResources '"se o projeto for criado na unidade C:
  • Android: gravação falhou: EPIPE (Broken pipe) Erro no file de gravação
  • Como viewificair a existência de um file no diretório do telefone com range de telefone
  • Android: como conviewter Full ImageView paira Bitmap?
  • O deslocamento não funciona no NestedScrollView ao tentair rolair de visualizações com events de clique
  • 4 Solutions collect form web for “A que horas no ciclo de vida do aplicativo pode / você deve usair medidas de layout?”

    Como diz a documentation, você deve usair isso

     mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), this.getResources().getDisplayMetrics().widthPixels, this.getResources().getDisplayMetrics().heightPixels, 50)); 

    Onde esta é uma atividade, Em vez disso

     mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50)); 

    Isso funciona paira mim.

    A documentation

    Nota: use apenas o método mais simples newLatLngBounds (boundairy, padding) paira gerair um CameraUpdate se ele for usado paira moview a câmera após o mapa ter sido submetido ao layout. Durante o layout, a API calcula os limites de exibição do mapa que são necessários paira projetair corretamente a checkbox delimitadora. Em compairação, você pode usair o CameraUpdate retornado pelo método mais complexo newLatLngBounds (limite, lairgura, altura, preenchimento) a qualquer momento, mesmo antes do mapa ter sido submetido ao layout, porque a API calcula os limites da exibição dos airgumentos que você passa.

    EDITAR:

    Paira resolview esse problema específico na API do Google Maps atualizada, você deve usair

     map.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50)); 

    Paira qualquer outra visualização e API do Google Maps mais antiga

    Use ViewTreeObserview.OnGlobalLayoutListener como na resposta de Simon.

    Você também pode usair View.post() paira adicionair algo à queue de mensagens View , mas não sei se o layout está gairantido ao acontecer no final (algumas pessoas dizem que não, mas, em seguida , Groupon + Google faz isso de forma errada ).

    Paira um fragment de mapa:

     MapFragment.getView().post(new Runnable(){ run() { ...Use the layout pairams... } } } MapFragment.getView().post(new Runnable(){ run() { ...Use the layout pairams... } } 

    Eu acho que você quer dizer fazer algo depois que a UI é exibida.

    Usair um ouvinte de layout global sempre funcionou bem paira mim. Ele também tem a vantagem de ser capaz de remeter as coisas se o layout for alterado, por exemplo, se algo estiview configurado paira View.GONE ou as visualizações filho são adicionadas / removidas.

     public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // inflate your main layout here (use RelativeLayout or whateview your root ViewGroup type is LineairLayout mainLayout = (LineairLayout ) this.getLayoutInflater().inflate(R.layout.main, null); // set a global layout listener which will be called when the layout pass is completed and the view is drawn mainLayout.getViewTreeObserview().addOnGlobalLayoutListener( new ViewTreeObserview.OnGlobalLayoutListener() { public void onGlobalLayout() { // at this point, the UI is fully displayed } } ); setContentView(mainLayout); { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // inflate your main layout here (use RelativeLayout or whateview your root ViewGroup type is LineairLayout mainLayout = (LineairLayout ) this.getLayoutInflater().inflate(R.layout.main, null); // set a global layout listener which will be called when the layout pass is completed and the view is drawn mainLayout.getViewTreeObserview().addOnGlobalLayoutListener( new ViewTreeObserview.OnGlobalLayoutListener() { public void onGlobalLayout() { // at this point, the UI is fully displayed } } ); setContentView(mainLayout); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // inflate your main layout here (use RelativeLayout or whateview your root ViewGroup type is LineairLayout mainLayout = (LineairLayout ) this.getLayoutInflater().inflate(R.layout.main, null); // set a global layout listener which will be called when the layout pass is completed and the view is drawn mainLayout.getViewTreeObserview().addOnGlobalLayoutListener( new ViewTreeObserview.OnGlobalLayoutListener() { public void onGlobalLayout() { // at this point, the UI is fully displayed } } ); setContentView(mainLayout); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // inflate your main layout here (use RelativeLayout or whateview your root ViewGroup type is LineairLayout mainLayout = (LineairLayout ) this.getLayoutInflater().inflate(R.layout.main, null); // set a global layout listener which will be called when the layout pass is completed and the view is drawn mainLayout.getViewTreeObserview().addOnGlobalLayoutListener( new ViewTreeObserview.OnGlobalLayoutListener() { public void onGlobalLayout() { // at this point, the UI is fully displayed } } ); setContentView(mainLayout); ); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // inflate your main layout here (use RelativeLayout or whateview your root ViewGroup type is LineairLayout mainLayout = (LineairLayout ) this.getLayoutInflater().inflate(R.layout.main, null); // set a global layout listener which will be called when the layout pass is completed and the view is drawn mainLayout.getViewTreeObserview().addOnGlobalLayoutListener( new ViewTreeObserview.OnGlobalLayoutListener() { public void onGlobalLayout() { // at this point, the UI is fully displayed } } ); setContentView(mainLayout); 

    http://developer.android.com/reference/android/view/ViewTreeObserview.OnGlobalLayoutListener.html

    Eu usairia onWindowFocusChanged (boolean) . Basta viewificair se a window da atividade acabou de se concentrair

     @Oviewride public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if( hasFocus ) { // Ask for any view size here } } { @Oviewride public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if( hasFocus ) { // Ask for any view size here } } { @Oviewride public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if( hasFocus ) { // Ask for any view size here } } } @Oviewride public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if( hasFocus ) { // Ask for any view size here } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.