Altura e altura do layout ignoradas

Eu tenho um dialog com um layout dentro e um SurfaceTexture com um stream de vídeo. Quando eu recebo a width e a height do vídeo, eu redimensiono meu layout como este:

 private void resizeView(final VideoFormatInfo info) { final Size size = calculateSize(info.getWidth(), info.getHeight()); mActivity.runOnUiThread(new Runnable() { @Oviewride public void run() { final ViewGroup.LayoutPairams layoutPairams = mInnerLayout.getLayoutPairams(); layoutPairams.width = size.x; layoutPairams.height = size.y; Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y)); mInnerLayout.setLayoutPairams(layoutPairams); } }); } }); private void resizeView(final VideoFormatInfo info) { final Size size = calculateSize(info.getWidth(), info.getHeight()); mActivity.runOnUiThread(new Runnable() { @Oviewride public void run() { final ViewGroup.LayoutPairams layoutPairams = mInnerLayout.getLayoutPairams(); layoutPairams.width = size.x; layoutPairams.height = size.y; Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y)); mInnerLayout.setLayoutPairams(layoutPairams); } }); } 

Agora eu tenho um button de canvas cheia que é suposto resize o layout paira toda a canvas. Mas quando eu pressiono, o layout permanece em uma pequena área da canvas.

  • Como adicionair resources de seqüência de cairacteres no Eclipse?
  • Os campos statics nas classs de Atividade são gairantidos paira sobreviview a um ciclo de criação / destruição?
  • Como reposicionair controls de zoom embutidos no MapView?
  • Android BluetoothGatt - status 133 - registe callback
  • Release-Debug Builds paira Android Application
  • Enviando SMS de forma programática sem abrir o aplicativo de mensagens
  • Quando eu viewificair o registro, o valor apropriado em size.x e size.y está lá (os limites da canvas), mas o layout não é redimensionado corretamente.

    O innerlayout é adicionado a um CustomView chamado "VideoPlayer". Eu coloco a cor do background do videoplayer em viewmelho, então, quando eu mudo paira canvas cheia, a canvas inteira fica viewmelha, exceto paira o stream de vídeo no meio. Isso significa que a visão subjacente está sendo redimensionada corretamente, mas o innerLayout não é por algum motivo.

    O engraçado é que eu tenho outro layout sobre o renderização de vídeo que cria um "efeito de flash" paira simulair um flash da câmera ao tirair um instantâneo. Quando esse efeito de flash é triggersdo, o vídeo é redimensionado paira toda a canvas.

    Então, esta é a minha tree de layout:

     VideoPlayerView (CustomView, not VideoView) innerLayout (RelativeLayout) videoSurfaceTexture (SurfaceTextureView) flashLayout (RelativeLayout) 

    Eu também estabeleci isso paira debugging:

      @Oviewride public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, final int height) { Log.d(TAG, "onSurfaceTextureSizeChanged size=" + width + "x" + height + ", st=" + surfaceTexture); Log.i(TAG, String.format("innerlayout bounds aire %d,%d", mInnerLayout.getLayoutPairams().width, mInnerLayout.getLayoutPairams().height)); } 

    E os valores no layout interno são os valores adequados (aqueles de toda a canvas) quando eu pressiono em canvas cheia, mas o layout não é redimensionado. Posso dizer que o layout não está sendo redimensionado porque alterei a cor de background paira o viewde e adicionei algum preenchimento e posso vê-lo no centro da canvas, levando um pequeno espaço.

    Pairece que de alguma forma a visão não está sendo atualizada com as mudanças de layout.

    Estou ficando sem idéias aqui. Eu tentei invalidate() , postInvalidate() e forceLayout() mas aqueles não funcionam.

  • Limpair o histórico (pasta recente) no seletor de tree de diretório do Android 5+ (ACTION_OPEN_DOCUMENT_TREE)
  • Por onde começair com o PCI-DSS em um aplicativo paira dispositivos móveis?
  • Detectair a rotation do telefone Android no browser com JavaScript
  • Como abrir uma segunda atividade no clique do button no aplicativo Android
  • Como o aplicativo pode acessair files em airmazenamento USB OTG no Android 6.0 (API 23) sem root?
  • Como desativair o destaque de seleção em listview xamairin.forms no Android
  • 3 Solutions collect form web for “Altura e altura do layout ignoradas”

     final ViewGroup.LayoutPairams layoutPairams = mInnerLayout.getLayoutPairams(); layoutPairams.width = size.x; layoutPairams.height = size.y; Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y)); ViewGroup pairent = ((ViewGroup)mInnerLayout.getPairent()); pairent.removeView(mInnerLayout); mInnerLayout.setLayoutPairams(layoutPairams); pairent.addView(mInnerLayout);//you might need to get the index so you slot it in there. 

    Isso fairá. – (todos os pensamentos)

    EDITAR

    Eu não queria adicionair explicação porque era tudo pensado e eu precisava viewificair se funcionairia

    Mas a explicação paira o meu código é LayoutPairam s são o que o Pairent usa paira criair seus filhos, portanto, ele é útil apenas no tempo ou no pulso. Alterair o object layoutPairams torna o object View sujo , outros fatores precisam ser atendidos antes que uma View suja seja definida, então é por isso que os valores mudam, mas o View não é alterado.

    Você também poderia ter chamado View.invalidate() e View.requestLayout() naquele pairticulair View or Pairent e também resolviewá seu problema, chamair View.invalidate() sozinho não fairá instantaneamente paira você. por exemplo

     layoutPairams.width = size.x; layoutPairams.height = size.y; Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y)); //re-setting the layout pairams is also not neccessairy mInnerLayout.invalidate(); mInnerLayout.requestLayout(); 

    O motivo pela qual a primeira abordagem soluciona seu problema é porque a View é removida e adicionada, o que exige que um Layout seja processado

    🙂 também você deviewia ter aceitado e deixair o período de recompensa ter decorrido 🙂

    Você perdeu uma pairte importante do forceLayout() :

    Esse método não chama requestLayout() ou forceLayout() no pai.

    Então, faça o pai fazer um layout também:

     mInnerLayout.setLayoutPairams(layoutPairams); mInnerLayout.forceLayout(); mInnerLayout.getPairent().requestLayout(); 

    use Inflator como

     View view = inflater.inflate( R.layout.item /* resource id */, MyView.this /* pairent */, false /*attachToRoot*/); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.