Tengo una clase simple AppPopupque amplía FrameLayout. La clase infla su contenido y lo almacena en la variable de contenido. Necesito que el contenido esté en el centro de la vista de mi ventana emergente. -1 en este método

public class AppPopup extends FrameLayout {
    private View content;
    private View bg;
    public AppPopup(@NonNull Context context) {
        super(context);
    }

    public AppPopup(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLayout(int resId) {
        LayoutInflater li=LayoutInflater.from(getContext());
        bg=li.inflate(R.layout.popup_bg_fade,null);
        content=li.inflate(resId,null);
    }
    public void show() {
        addView(bg);
        addView(content);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        Log.d("layout",content.getLayoutParams().width+","+content.getLayoutParams().height+","+(content.getParent()==this)); -1,-1,true
        content.setX(widthSize/2-content.getLayoutParams().width/2);
        content.setY(heightSize/2-content.getLayoutParams().height/2);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Log.d("layout",content.getLayoutParams().width+","+content.getLayoutParams().height+","+(content.getParent()==this)); //-1,-1,true
    }
}

Lo llamo en la vista principal:

AppPopup popup=new AppPopup(this);
root.addView(popup);
popup.setLayout(R.layout.gameover_popup1);
popup.show();

Dentro de onLayout, el tamaño también es igual a -1. Pero puedo ver mi vista en la pantalla con el tamaño correcto. Sé que me estoy perdiendo algo simple, pero no puedo entender qué.

respuesta

int anchoTamaño = MeasureSpec.getSize(widthMeasureSpec); puede ser WRAP_CONTENT o MATCH_PARENT.

Puede obtener solo (funciona solo después de super.onMeasure ya que se establece enMeasured después de terminar):

int widthSize = getMeasuredWidth();
int heightSize = getMeasuredHeight();

Para el ancho secundario después de la inflación, puede llamar DESPUÉS de super.onLayout child.getMeasuredWidth();