Set Layout params dinamicamente

? masmic @ | Original: StackOverFlow
---

Sto utilizzando la demo CameraPreview esempio API . Ho bisogno di aggiungere alcuni punti di vista ( pulsanti, ecc .. ) si sovrappongono alla SurfaceView .

Per questo, sto cercando di impostare i loro parametri, ma appaiono tutto il tempo nella parte in alto a sinistra dello schermo .

Questo è il metodo onCreate del codice :

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        btnTakePhoto = new Button(this);
        btnTakePhoto.setBackgroundResource(android.R.drawable.ic_menu_camera);


        /*Set container*/
        mPreview = new Preview(this);
        setContentView(mPreview);

        /*Set button params and add it to the view*/
        RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        buttonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        buttonParams.addRule(RelativeLayout.CENTER_VERTICAL);
        addContentView(btnTakePhoto, buttonParams);


        numberOfCameras = Camera.getNumberOfCameras();

        CameraInfo cameraInfo = new CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                defaultCameraId = i;
            }
        }
    }

Devo dire che i valori qui

RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

si aggiorna bene se li cambio . Quello che non cambia è quello che contiene il metodo addRule ( )

---

Top 5 Risposta

1Liam Neil Parker @

provare a impostare il genitore di btnTakePhoto a mPreview

btnTakePhoto.setParent(mPreview);

che farà sì che venga visualizzato il pulsante sopra l'anteprima .

2Weibo @

Sei vuoi aggiungere la btnTakPhoto al centro destra della vista ? in tal caso, avere una prova :

btn.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
3Liam Neil Parker @
ScrollView sv = new ScrollView(this);
this.addContentView(sv, new RelativeLayout.LayoutParams(screen.widthPixels, screen.heightPixels));
RelativeLayout FORM = new RelativeLayout(this);
sv.addView(FORM, new RelativeLayout.LayoutParams(screen.widthPixels, screen.heightPixels));

Devi essere l'obiettivo di una API di età superiore a 14, setParent dovrebbe funzionare con nuove API . Sopra codice è un modo alternativo, ma si avrebbe dovuto mettere tutto per codice, ma funziona . Spero che questo aiuti .

La forma è il contenitore, e si dovrebbe aggiungere altri componenti come FORM.addView ( BTN ) con params di layout relative .

4RizN81 @

Try This

// create main linearLayout and set properties
        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setBackgroundColor(Color.TRANSPARENT);

        // Create camera layout params
        LinearLayout.LayoutParams cameralayoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

        // set layout params
        linearLayout.setLayoutParams(cameralayoutParams);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        int m_Height=ScreenHeight(this);
        int buttonWH = 80;

        // Create button for capture, save and discard
        captureButton = new Button(this);
        captureButton.setBackgroundResource(R.drawable.camera);
        captureButton.setWidth(buttonWH);
        captureButton.setHeight(buttonWH);

        saveButton = new Button(this);
        saveButton.setBackgroundResource(R.drawable.save);
        saveButton.setVisibility(View.INVISIBLE);
        saveButton.setWidth(buttonWH);
        saveButton.setHeight(buttonWH);

        discardButton = new Button(this);
        discardButton.setBackgroundResource(R.drawable.discard);
        discardButton.setVisibility(View.INVISIBLE);
        discardButton.setWidth(buttonWH);
        discardButton.setHeight(buttonWH);

        // Create layout for controls
        controlLayout = new LinearLayout(this);
        controlLayout.setOrientation(LinearLayout.VERTICAL);
        controlLayout.setBackgroundColor(Color.BLACK);

        // Create params for control layout
        LinearLayout.LayoutParams controlLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.MATCH_PARENT);

        // Set layout params
        controlLayout.setLayoutParams(controlLayoutParams);

        int buttonMargin = ((m_Height - (buttonWH * 3)) / 3) / 2;

        // Create params for capture button
        LinearLayout.LayoutParams buttonCaptureParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT);
        buttonCaptureParams.setMargins(10, buttonMargin, 10, buttonMargin);

        LinearLayout.LayoutParams buttonSaveParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT);
        buttonSaveParams.setMargins(10, buttonMargin, 10, buttonMargin);

        LinearLayout.LayoutParams buttonDiscardParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT);
        buttonDiscardParams.setMargins(10, buttonMargin, 10, buttonMargin);

        // Add button to main layout
        controlLayout.addView(discardButton, buttonDiscardParams);
        controlLayout.addView(captureButton, buttonCaptureParams);
        controlLayout.addView(saveButton, buttonSaveParams);

        // Make it full screen
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // set main layout as content view
        setContentView(linearLayout);

Metodo per ottenere l'altezza e la larghezza dello schermo

public static int ScreenHeight(Context ctx) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        ((Activity) ctx).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        return displaymetrics.heightPixels;
    }       
public static int ScreenWidth(Context ctx) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        ((Activity) ctx).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        return displaymetrics.widthPixels;
    }
5masmic @

Finalmente risolto . Nel fare setContentView ( ) e addContentView ( ), stavo mettendo la vista in una DecorView che è un FrameLayout . Così, LayoutParams fanno riferimento RelativeLayout non funziona, come per una FrameLayout solo le caratteristiche generiche di LayoutParams funzioneranno .

Quindi, la cosa è di creare prima un relativeLayout, impostare i params e impostarlo come il contenuto :

RelativeLayout relativeLayout = new RelativeLayout(this);
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT);
setContentView(relativeLayout, rlp);

Ma, ora, ogni volta che voglio aggiungere una vista, devo aggiungere che a questo relativeLayout in questo modo :

relativeLayout.addView(View, Params);

Just this.