Autore Topic: QuickAction - ContentRail non viene mostrato nella posizione corretta  (Letto 956 volte)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Non riesco a rimisurare un layout...
allora, vi posto due foto di quello che succede:

Questo è quello che voglio che succeda:


Questo invece quello che non voglio che succeda:


La differenza, se vedete è che nel primo il popup punta al centro dell'elemento, nel secondo invece il popup punta a sopra l'elemento.
Il problema ho visto che è dato dalla riga TelefonoSoccorso, che se occupa due righe aumenta la dimensione del popup e lo fa quindi mostrare correttamente al centro dell'item list.
Mi spiego meglio:
Se misuro l'altezza del popup, il risultato che viene fuori è SEMPRE 159.
Se io clicco l'elemento in fondo allo schermo, ottengo come anchor.top = 438.
Il popup viene quindi mostrato nella posizione (parlo di altezza) 438-159 = 279.
Il problema è che se il popup è piu grande (primo caso) viene mostrato giusto, se invece è wrappato alle righe minime, non punta al punto giusto.
Come soluzione potrei dirgli di iniziare il popup qualche pixel piu in giu, ma in questo caso poi mi troverei (se il popup è piu grande come nel primo caso) ad averlo troppo in giu.

Ho provato a misurare dinamicamente la grandezza del popup, ma niente, sia che sia grande o no,il suo valore è sempre 159.
Vi posto l'xml del mio popup_item, del quickaction e del codice java che richiamo per fare la show, ma è tutto codice simile a quello di JD nel suo tutorial sui ContextRail, dato che proviene dalla stessa fonte...

POPUP_ITEM
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/popup" android:gravity="center" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:orientation="vertical"
        android:weightSum="7" android:paddingBottom="0dip" android:paddingLeft="5dip"
        android:paddingRight="5dip">
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/idText" android:text="ID:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/userId" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="userid" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/naText" android:text="Nome:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/nome" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="nome" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/coText" android:text="Cognome:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/cognome" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="nome" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/cfText" android:text="Codice Fiscale:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/cFiscale" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="cFiscale" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/telText" android:text="Telefono:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/tel" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="tel" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/telSocText" android:text="Telefono Soccorso:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/telSocc" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="tel" android:textSize="10dp"
                        android:layout_weight="1" android:textStyle="bold" android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
        <LinearLayout android:layout_height="wrap_content"
                android:layout_width="fill_parent" android:paddingLeft="2dip"
                android:paddingRight="2dip" android:orientation="horizontal"
                android:layout_weight="1" android:weightSum="2">
                <TextView android:id="@+id/dnText" android:text="Data di Nascita:"
                        android:layout_height="fill_parent" android:layout_width="0dp"
                        android:textSize="11dp" android:textStyle="bold"
                        android:layout_weight="1" android:textColor="#00FF00">
                </TextView>
                <TextView android:id="@+id/data" android:layout_height="fill_parent"
                        android:layout_width="0dp" android:text="dataNascita"
                        android:textSize="10dp" android:layout_weight="1" android:textStyle="bold"
                        android:textColor="#FFFFFF">
                </TextView>
        </LinearLayout>
</LinearLayout>

Quickaction.xml
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="wrap_content">
        <FrameLayout android:layout_marginTop="10dip" android:id="@+id/header2"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:background="@drawable/quickcontact_top_frame" />
        <ImageView android:id="@+id/arrow_up" android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:src="@drawable/quickcontact_arrow_up" />
        <LinearLayout android:id="@+id/tracks"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:fadingEdgeLength="0dip" android:layout_below="@id/header2"
                android:background="@drawable/quickcontact_slider_background"
                android:paddingTop="4dip" android:paddingBottom="4dip"
                android:orientation="horizontal">
        </LinearLayout>
        <FrameLayout android:id="@+id/footer" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_below="@id/tracks"
                android:background="@drawable/quickcontact_bottom_frame" />
        <ImageView android:id="@+id/arrow_down" android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:layout_marginTop="-1dip"
                android:layout_below="@id/footer" android:src="@drawable/quickcontact_arrow_down" />
</RelativeLayout>

Codice java in cui faccio lo show e creo il popup:
Codice (Java): [Seleziona]
        public void show() {
                preShow();
                int[] loc = new int[2];
                anchor.getLocationOnScreen(loc);
                Rect anchorRect = new Rect(loc[0], loc[1], loc[0] + anchor.getWidth(), loc[1]
                                + anchor.getHeight());
//Prima creo gli elementi dentro al popup,poi misuro l'altezza
                createActionList();
                root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                int rootWidth = root.getMeasuredWidth();
                int rootHeight = root.getMeasuredHeight();
                int screenWidth = windowManager.getDefaultDisplay().getWidth();
                       
                int xPos = (screenWidth - rootWidth) / 2;
                int yPos = anchorRect.top - rootHeight;
                boolean onTop = true;
                // display on bottom
                if (rootHeight > anchorRect.top) {
                        yPos = anchorRect.bottom;
                        onTop = false;
                }
                showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), anchorRect.centerX());
                setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);
                window.showAtLocation(this.anchor, Gravity.NO_GRAVITY, xPos, yPos);
                if (animateTrack) mTrack.startAnimation(mTrackAnim);
        }

        /**
         * Creazione e aggiunta della view
         */

        private void createActionList() {
                View view;
                String userId = item.getId()+"";
                String cFiscale = item.getcFiscale();
                String nome = item.getNome();
                String cognome = item.getCognome();
                String data = item.getDataNascitaFormatted();
                String tel = item.getTelefono();
                String telSocc = item.getTelSoccorso();
                view = getItem(userId, cFiscale,nome,cognome,data,tel,telSocc);
                view.setFocusable(true);
                view.setClickable(true);
                LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
                mTrack.addView(view,0, lay);
        }

        private View getItem(String userId,String cFiscale,String nome,String cognome, String data,String telefono,String telSoccorso) {
                LinearLayout container = (LinearLayout) inflater.inflate(R.layout.popup_item, null);
                TextView userIdTv = (TextView) container.findViewById(R.id.userId);
                TextView cFiscaleTv = (TextView) container.findViewById(R.id.cFiscale);
                TextView dataTv = (TextView) container.findViewById(R.id.data);
                TextView nomeTv = (TextView) container.findViewById(R.id.nome);
                TextView cognomeTv=(TextView)container.findViewById(R.id.cognome);
                TextView telTv = (TextView) container.findViewById(R.id.tel);
                TextView telSocTv = (TextView) container.findViewById(R.id.telSocc);
               
                if (userId != null) {
                        userIdTv.setText(userId);
                }if (nome != null) {
                        nomeTv.setText(nome);
                }if (cognome != null) {
                        cognomeTv.setText(cognome);
                }if (cFiscale != null) {
                        cFiscaleTv.setText(cFiscale);
                }if (data != null) {
                        dataTv.setText(data);
                }if (telefono != null){
                        telTv.setText(telefono);
                }if(telSoccorso != null){
                        telSocTv.setText(telSoccorso);
                }
                return container;
        }

Ho provato a modificare i parametri nel layout del singolo elemento, ma se metto wrap content mi ritrovo con le stringhe tagliate e non completamente visibili.
Ho provato a misurare sia in getItem, sia dopo la window.show il dialog,ma mi viene sempre 159, pare che se è piu grande con la measure non se ne accorga...
qualcuno sa aiutarmi gentilmente?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #1 il: 16 Novembre 2010, 20:14:38 CET »
0
così su due piedi mi viene in mente una cosa, che magari hai già provato, ma tentar non nuoce.

Ho visto che misuri l'altezza con getMeasuredHeight, che io sappia quella non è la dimensione reale, ma quella ideale della View, cioè quella che vorrebbe avere. La dimensione reale si dovrebbe ottenere con getHeight. Torna 159 anche con quella funzione?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #2 il: 16 Novembre 2010, 20:20:05 CET »
0
così su due piedi mi viene in mente una cosa, che magari hai già provato, ma tentar non nuoce.

Ho visto che misuri l'altezza con getMeasuredHeight, che io sappia quella non è la dimensione reale, ma quella ideale della View, cioè quella che vorrebbe avere. La dimensione reale si dovrebbe ottenere con getHeight. Torna 159 anche con quella funzione?
ho provato anche con quella,e mi risulta 0...

11-16 19:19:35.367: INFO/System.out(290): getHeight = 0


a me basterebbe anche solo misurare il layout interno al quickdialog, poi mi faccio i conti con la dimensione delle immagini mostrate (o prendo le dimensioni via codice), solo che non riesco proprio a prendere la dimensione...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #3 il: 16 Novembre 2010, 20:37:07 CET »
0
ho provato anche con quella,e mi risulta 0..

Mmmmm, deve essere perché la misura reale android la conosce dopo il measure, durante la fase di layout. Se hai modo, prova a loggare il valore che rende, dopo il draw.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #4 il: 17 Novembre 2010, 00:00:54 CET »
0
Mmmmm, deve essere perché la misura reale android la conosce dopo il measure, durante la fase di layout. Se hai modo, prova a loggare il valore che rende, dopo il draw.
dopo il draw intendi dopo:
window.showAtLocation(this.anchor, Gravity.NO_GRAVITY, xPos, yPos);

ci ho provato ma anche li nada,e poi vorrebbe dire disegnarla,poi spostarla di colpo, o sbaglio?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #5 il: 17 Novembre 2010, 17:01:41 CET »
0
non lo segnalo come risolto perchè non è effettivamente risolto,ho applicato un workaround sporco ma che funziona piu o meno, ci ho applicato un offset  quando faccio yPos.
grazie comunque bradipao,ma da quanto ho capito non si può avere la dimensione effettiva,a meno di riscrivere la funzione di onLayout (che non ho voglia di fare per questa cavolata).
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #6 il: 17 Novembre 2010, 17:28:13 CET »
0
non lo segnalo come risolto perchè non è effettivamente risolto,ho applicato un workaround sporco ma che funziona piu o meno, ci ho applicato un offset  quando faccio yPos. grazie comunque bradipao,ma da quanto ho capito non si può avere la dimensione effettiva,a meno di riscrivere la funzione di onLayout (che non ho voglia di fare per questa cavolata).

Sono d'accordo. Anche da quello che avevo letto (perchè durante la settimana lavorativa non ho molto tempo libero per fare prove dirette) avevo capito che la dimensione "reale" non era nota sino alla fine, cioè dal Layout in poi. Giusto lasciare il problema aperto, non sia mai che un giorno riusciamo a chiuderlo.  :-P
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:QuickAction - ContentRail non viene mostrato nella posizione corretta
« Risposta #7 il: 17 Novembre 2010, 17:34:56 CET »
0
Sono d'accordo. Anche da quello che avevo letto (perchè durante la settimana lavorativa non ho molto tempo libero per fare prove dirette) avevo capito che la dimensione "reale" non era nota sino alla fine, cioè dal Layout in poi. Giusto lasciare il problema aperto, non sia mai che un giorno riusciamo a chiuderlo.  :-P
si, anche perchè se richiamo la show() e poi subito dopo misuro ma non da la dimensione corretta,proprio perchè evidentemente la misura ancora non è pronta. Forse se misuro un quarto d'ora dopo va :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia