Autore Topic: VieWGroup errore nella libreria ufficiale ???  (Letto 470 volte)

Offline stefano111

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu 16.04
VieWGroup errore nella libreria ufficiale ???
« il: 20 Maggio 2016, 22:14:02 CEST »
0
Ciao a tutti ,
premetto che sono ancora in fase di studio con android ma sfogliando la libreria ufficiale ho notato che qualcosa non mi tornava nell esempio che fanno per gestire una ViewGroup... di seguito vi allego il codice copiato direttamente dalla pagina
Codice (Java): [Seleziona]
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RemoteViews;

/**
 * Example of writing a custom layout manager.  This is a fairly full-featured
 * layout manager that is relatively general, handling all layout cases.  You
 * can simplify it for more specific cases.
 */

@RemoteViews.RemoteView
public class CustomLayout extends ViewGroup {
    /** The amount of space used by children in the left gutter. */
    private int mLeftWidth;

    /** The amount of space used by children in the right gutter. */
    private int mRightWidth;

    /** These are used for computing child frames based on their gravity. */
    private final Rect mTmpContainerRect = new Rect();
    private final Rect mTmpChildRect = new Rect();

    public CustomLayout(Context context) {
        super(context);
    }

    public CustomLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Any layout manager that doesn't scroll will want this.
     */

    @Override
    public boolean shouldDelayChildPressedState() {
        return false;
    }

    /**
     * Ask all children to measure themselves and compute the measurement of this
     * layout based on the children.
     */

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int count = getChildCount();

        // These keep track of the space we are using on the left and right for
        // views positioned there; we need member variables so we can also use
        // these for layout later.
        mLeftWidth = 0;
        mRightWidth = 0;

        // Measurement will ultimately be computing these values.
        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;

        // Iterate through all children, measuring them and computing our dimensions
        // from their size.
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                // Measure the child.
                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);

                // Update our size information based on the layout params.  Children
                // that asked to be positioned on the left or right go in those gutters.
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                if (lp.position == LayoutParams.POSITION_LEFT) {
                    mLeftWidth += Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                } else if (lp.position == LayoutParams.POSITION_RIGHT) {
                    mRightWidth += Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                } else {
                    maxWidth = Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                }
                maxHeight = Math.max(maxHeight,
                        child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
                childState = combineMeasuredStates(childState, child.getMeasuredState());
            }
        }

        // Total width is the maximum width of all inner children plus the gutters.
        maxWidth += mLeftWidth + mRightWidth;

        // Check against our minimum height and width
        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

        // Report our final dimensions.
        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
                resolveSizeAndState(maxHeight, heightMeasureSpec,
                        childState << MEASURED_HEIGHT_STATE_SHIFT));
    }

    /**
     * Position all children within this layout.
     */

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        final int count = getChildCount();

        // These are the far left and right edges in which we are performing layout.
        int leftPos = getPaddingLeft();
        int rightPos = right - left - getPaddingRight();

        // This is the middle region inside of the gutter.
        final int middleLeft = leftPos + mLeftWidth;
        final int middleRight = rightPos - mRightWidth;

        // These are the top and bottom edges in which we are performing layout.
        final int parentTop = getPaddingTop();
        final int parentBottom = bottom - top - getPaddingBottom();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();

                final int width = child.getMeasuredWidth();
                final int height = child.getMeasuredHeight();

                // Compute the frame in which we are placing this child.
                if (lp.position == LayoutParams.POSITION_LEFT) {
                    mTmpContainerRect.left = leftPos + lp.leftMargin;
                    mTmpContainerRect.right = leftPos + width + lp.rightMargin;
                    leftPos = mTmpContainerRect.right;
                } else if (lp.position == LayoutParams.POSITION_RIGHT) {
                    mTmpContainerRect.right = rightPos - lp.rightMargin;
                    mTmpContainerRect.left = rightPos - width - lp.leftMargin;
                    rightPos = mTmpContainerRect.left;
                } else {
                    mTmpContainerRect.left = middleLeft + lp.leftMargin;
                    mTmpContainerRect.right = middleRight - lp.rightMargin;
                }
                mTmpContainerRect.top = parentTop + lp.topMargin;
                mTmpContainerRect.bottom = parentBottom - lp.bottomMargin;

                // Use the child's gravity and size to determine its final
                // frame within its container.
                Gravity.apply(lp.gravity, width, height, mTmpContainerRect, mTmpChildRect);

                // Place the child.
                child.layout(mTmpChildRect.left, mTmpChildRect.top,
                        mTmpChildRect.right, mTmpChildRect.bottom);
            }
        }
    }

le parti di codice che non mi sono chiare sono queste;

Codice (Java): [Seleziona]
 
    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                if (lp.position == LayoutParams.POSITION_LEFT) {
                    mLeftWidth += Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                } else if (lp.position == LayoutParams.POSITION_RIGHT) {
                    mRightWidth += Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                } else {
                    maxWidth = Math.max(maxWidth,
                            child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
                }

dove la variabile lp istanziata come un oggetto LayoutParam non puo ricevere nessuno degli attributi che li vengono assegnati di seguito ti "position" ," leftMargin  " .
Se mi potreste dare un chiarimento e se c 'è effettivamente un errore come si potrebbe risolvere ????

Vi ringrazio in anticipo e spero di essere stato chiaro nell ' esporre il mio dubbio

Offline stefano111

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu 16.04
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #1 il: 23 Maggio 2016, 17:07:18 CEST »
0
Scusate...Ma potrei avere una risposta? Da solo non son ancora riuscito a capire

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #2 il: 24 Maggio 2016, 01:42:48 CEST »
0
Io sinceramente non ho capito il problema

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #3 il: 24 Maggio 2016, 14:39:09 CEST »
0
Probabilmente qui:

Codice (Java): [Seleziona]
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
ottieni un'istanza di ViewGroup.LayoutParams, che non ha gli attributi da te indicati.

Solitamente quando si crea una classe derivata di ViewGroup che ha altri attributi di layout oltre quelli di ViewGroup.LayoutParams si crea anche una classe derivata di LayoutParams, nel tuo caso CustomLayout.LayoutParams.

Prendi questo esempio: CustomLayout.java

Alla riga 99 il codice è quasi identico al tuo, ma funziona perché alla riga 211 viene dichiarata la classe LayoutParams che estende MarginLayoutParams e quindi quel riferimento a LayoutParams di riga 99 va inteso come CustomLayout.LayoutParams e non ViewGroup.LayoutParams come nel tuo caso.

P.S.: A meno che tu non sia davvero, ma DAVVERO sicuro di un bug (comunque non infrequenti), non dare la colpa alle librerie, potresti apparire presuntuoso.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #4 il: 24 Maggio 2016, 18:18:14 CEST »
0
Nonostante so realizzare quasi tutto si android quando leggo risposte come queste penso di essere deficiente

Offline stefano111

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu 16.04
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #5 il: 24 Maggio 2016, 22:33:27 CEST »
0
Grazie Ohmnibus era proprio quello il mio dubbio l hai centrato in pieno.
In effetti non ho letto a fondo (come un pirla ) tutto l'esempio che viene riportato sul sito .
Cmq tutto questo mi sarebbe dovuto essere utile per creare un layout dinamico , o meglio , vorrei che la mia activity una volta aperta possa presentare una view ,nello specifico una TextView in posizioni diverse a seconda di quale opzione viene selezionato nell' activity precedente .
Come posso fare ? Sono sulla strada giusta?
Voglio ancora specificare che io android lo sto ancora studiando e con java me la cavicchio ma non poi così tanto ,quindi se mi potreste dare un consiglio ve ne sarei mooooolto grato  :-)

Grazie ancora
ciao

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #6 il: 27 Maggio 2016, 14:27:20 CEST »
0
In genere i viewgroup disponibili sono sufficienti per la quasi totalità dei casi, anche perché definirne uno nuovo non è banale - e comunque di solito si eredita da una classe più specifica, tipo LinearLayout.

Detto questo, dipende molto da cosa devi fare nello specifico: Devi visualizzare sempre e solo un elemento? Le posizioni possibili quali sono? E' possibile stabilire una posizione predefinita o è per forza basata da parametri ricevuti?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline stefano111

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu 16.04
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #7 il: 27 Maggio 2016, 20:16:48 CEST »
0
Allora per essere più preciso io vorrei inserire un testo in una immagine e poi far in modo di salvare testo e immagine come unico oggetto, per questo chiedevo se una ViewGroup faceva al caso mio. Il testo potrebbe avere una posizione standard anche se io contavo di assegnarla tramite checkbox che a seconda di quali sono selezionate il testo compare in una determinata posizione.
Io per ora sto tentando con un fragment che contiene il testo e l immagine e tramite una finestra di dialogo,contente le checkbox,  vorrei assegnare la posizione al testo . Anche se ancora non so come far comunicare le due cose.
La mia ViewGroup  servirebbe a contenere l immagine per la grandezza del layout e il testo posizionato dinamicamente e poi il tutto salvato in un file jpg jpeg o altro .
E' fattibile una cosa del genere ?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #8 il: 27 Maggio 2016, 23:25:46 CEST »
0
Io userei un RelativeLayout.

Imposti come sfondo la tua immagine, e la TextView la sposti dove ti pare cambiandone i LayoutParams.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline stefano111

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu 16.04
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #9 il: 29 Maggio 2016, 10:00:05 CEST »
0
E' quello che ho fatto in effetti ma non ho idea di come salvarlo poi ..... qualche suggerimento ?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:VieWGroup errore nella libreria ufficiale ???
« Risposta #10 il: 30 Maggio 2016, 14:10:27 CEST »
0
Devi convertire la vista in un bitmap, poi puoi salvarlo.

Codice (Java): [Seleziona]
public static Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
    Canvas c = new Canvas(b);
    v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
    v.draw(c);
    return b;
}

Dove il parametro v è la vista da convertire, nel tuo caso il RelativeLayout o la tua CustomView.

Riferimenti: http://stackoverflow.com/a/3036736/466938
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.