Autore Topic: [Frame Layout]Cambiare dinamicamente le dimensioni  (Letto 525 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
[Frame Layout]Cambiare dinamicamente le dimensioni
« il: 20 Aprile 2015, 17:59:02 CEST »
0
Salve ho definito un layout composto da 5 frame, ora dovrei definire le dimensioni delle frame a seconda delle dimensioni del display del dispositivo che ospita l'applicazione, ho provato il codice che posto di seguito ma l'applicazione mi crasha. Potreste aiutarmi ? Grazie.
Codice XML
Codice: [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativelayout_batteria"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F2F2F2"
   >
        <!--  Frame per il posizionamento della batteria [img] -->
               <FrameLayout
               android:id="@+id/frame1_batteria"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:background="#F2F2F2" >
                <ImageView
              android:id="@+id/kmRestanti"
              android:layout_marginLeft="10dp"
              android:layout_marginTop="10dp"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_vertical"
              android:background="@drawable/km_residui"/>

          </FrameLayout>
...
...
...

Codice Java
Codice (Java): [Seleziona]
public class BatteriaFragment extends Fragment {
        View rootView;
        public BatteriaFragment(){}
       
        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        rootView = inflater.inflate(R.layout.fragment_batteria, container, false);
         
        gestioneFrame();
       
        return rootView;
    }
       
        public void gestioneFrame(){
               
                FrameLayout layout = (FrameLayout) rootView.findViewById(R.id.frame1_batteria);    
                //Setto le dimensioni del layout che ospita il grafico dinamicamente al fine di poterlo adattare al device che ospita l'applicazione
                DisplayMetrics metrics = getResources().getDisplayMetrics();
                int width = metrics.widthPixels;
                int height = metrics.heightPixels;
                FrameLayout.LayoutParams parms = new FrameLayout.LayoutParams((int) (width*0.1),(int) (height*0.2));
                layout.setLayoutParams(parms);
        }
       
}

Di seguito vi posto anche lo stack trace
Codice: [Seleziona]
04-20 18:00:09.118: E/AndroidRuntime(14121): FATAL EXCEPTION: main
04-20 18:00:09.118: E/AndroidRuntime(14121): Process: info.androidhive.slidingmenu, PID: 14121
04-20 18:00:09.118: E/AndroidRuntime(14121): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.RelativeLayout$DependencyGraph.findRoots(RelativeLayout.java:1722)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.RelativeLayout$DependencyGraph.getSortedViews(RelativeLayout.java:1667)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.RelativeLayout.sortChildren(RelativeLayout.java:373)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:639)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:412)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2548)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.View.measure(View.java:17495)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2285)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1396)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1595)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6637)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:814)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.Choreographer.doCallbacks(Choreographer.java:614)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.Choreographer.doFrame(Choreographer.java:584)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:800)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.os.Handler.handleCallback(Handler.java:733)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.os.Handler.dispatchMessage(Handler.java:95)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.os.Looper.loop(Looper.java:146)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at android.app.ActivityThread.main(ActivityThread.java:5602)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at java.lang.reflect.Method.invokeNative(Native Method)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at java.lang.reflect.Method.invoke(Method.java:515)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
04-20 18:00:09.118: E/AndroidRuntime(14121):         at dalvik.system.NativeStart.main(Native Method)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #1 il: 20 Aprile 2015, 21:24:59 CEST »
0
I parametri di layout devono essere compatibili con il contenitore, non con il contenuto.

Nel tuo caso un RelativeLayout contiene un FrameLayout. A quest'ultimo devi impostare dei parametri di tipo RelativeLayout.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 Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #2 il: 21 Aprile 2015, 09:20:33 CEST »
0
Ciao Ohmnibus, ma in quel caso setterei la dimensioni di tutto il layout.
Io dovrei suddividere l'altezza del layout in tre sezioni ed in ognuna delle sezioni posizionare un frame layout.
Come potrei fare?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #3 il: 21 Aprile 2015, 10:04:52 CEST »
0
Anzitutto, se devi suddividere l'altezza in porzioni uguali, usa un LinearLayout.

Se questo non è il caso, continua ad essere valido il mio suggerimento.

Il concetto è questo: I tuoi FrameLayout devono essere disposti in un RelativeLayout, quindi le regole di adattamento dei FrameLayout devono essere "comprensibili" dal contenitore, appunto un RelativeLayout.

Quindi i parametri di layout dei FrameLayout devono essere di tipo RelativeLayout.LayoutParams.

Quindi devi intervenire qui:

Codice (Java): [Seleziona]
                FrameLayout.LayoutParams parms = new FrameLayout.LayoutParams((int) (width*0.1),(int) (height*0.2));
                layout.setLayoutParams(parms);

e cambiarlo in

Codice (Java): [Seleziona]
                RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams((int) (width*0.1),(int) (height*0.2));
                layout.setLayoutParams(parms);
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 Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #4 il: 21 Aprile 2015, 10:10:48 CEST »
0
Ciao Ohmnibus,
seguendo il tuo suggerimento ho apportato queste modifiche nella funzione gestioneFrame() :
Codice (Java): [Seleziona]
                RelativeLayout rl =  new RelativeLayout(getActivity());
                FrameLayout layout = (FrameLayout) rootView.findViewById(R.id.frame1_batteria);  
               
                 RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(0,100);
                layout.setLayoutParams(lp);
                rl.addView(layout);

ma l'applicazione mi crasha :(
« Ultima modifica: 21 Aprile 2015, 10:14:07 CEST da Raffyna »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #5 il: 21 Aprile 2015, 10:16:08 CEST »
0
Log dell'errore?

(comunque con new RelativeLayout.LayoutParams(0,100); stai richiedendo un frame di larghezza zero)
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 Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:[Frame Layout]Cambiare dinamicamente le dimensioni
« Risposta #6 il: 21 Aprile 2015, 12:20:43 CEST »
0
Ciao Ohmnibus,
ho risolto, grazie cmq per la disponibilità. Praticamente l'istruzione  rl.addView(layout); non deve essere applicata.
Per chiunque fosse interessato di seguito posto il codice funzionante :D


Codice (Java): [Seleziona]
public void gestioneFrame(){
                //Recupero dei pixel del display
                DisplayMetrics metrics = getResources().getDisplayMetrics();
                int width = metrics.widthPixels;
                int height = metrics.heightPixels;             
               
                FrameLayout frameLayout1 = (FrameLayout) rootView.findViewById(R.id.frame1_batteria);
                FrameLayout frameLayout2 = (FrameLayout) rootView.findViewById(R.id.frame2_batteria);
                FrameLayout frameLayout3 = (FrameLayout) rootView.findViewById(R.id.frame3_batteria);
                FrameLayout frameLayout4 = (FrameLayout) rootView.findViewById(R.id.frame4_batteria);
               
                /*Settaggio dinamico delle dimensioni dei frame che costituiscono il layout */
                 RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(width/3,(height/5)*2);
                 frameLayout1.setLayoutParams(lp);
               
                 RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(width,height/10);
                 lp2.addRule(RelativeLayout.BELOW, R.id.frame1_batteria);              
                 frameLayout2.setLayoutParams(lp2);
                 
                RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams((int) (width/3),(height/5)*2);
                lp3.addRule(RelativeLayout.BELOW, R.id.frame2_batteria);
                lp3.addRule(RelativeLayout.RIGHT_OF, R.id.frame4_batteria);
                frameLayout3.setLayoutParams(lp3);
               
                RelativeLayout.LayoutParams lp4 = new RelativeLayout.LayoutParams(width/3*2,(height/5)*2);
               
                lp4.addRule(RelativeLayout.BELOW, R.id.frame2_batteria);
                frameLayout4.setLayoutParams(lp4);
                /*---------------Fine Settaggio dimensioni --------------*/
               
        }


Codice XML :
Codice: [Seleziona]

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativelayout_batteria"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F2F2F2"
   
   >
        <!--  Frame per il posizionamento della batteria [img] -->
               <FrameLayout
               android:id="@+id/frame1_batteria"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:background="#F2F2F2" >
                <ImageView
              android:id="@+id/kmRestanti"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_vertical|center_horizontal"
              android:background="@drawable/km_residui"/>

          </FrameLayout>
           
    <!--  Frame per il posizionamento del testo indicante la % di cairca della batteria  -->       
            <FrameLayout
               android:id="@+id/frame1_1_batteria"
               android:layout_toRightOf="@+id/frame1_batteria"
               android:layout_above="@+id/frame2_batteria"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="#F2F2F2" >
                
                <RelativeLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:gravity="center_horizontal|center_vertical"
                            android:background="#F2F2F2">
                  <TextView
                                       android:id="@+id/text_kmResidui"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                       android:gravity="center_horizontal|center_vertical"
                                       android:text="Livello di carica"
                                       android:textAppearance="?android:attr/textAppearanceMedium" />
                 
                 
                          <TextView
                                       android:id="@+id/text_kmResiduiRicevuti"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                             android:layout_below="@+id/text_kmResidui"
                                       android:text="80 km"
                                       android:gravity="center_horizontal|center_vertical"
                                       android:textAppearance="?android:attr/textAppearanceLarge" />
                          </RelativeLayout>
    </FrameLayout>
   
   <!--  Frame per il posizionamento del testo indicante la modalità di ricarica della batteria  -->
        <FrameLayout
               android:id="@+id/frame2_batteria"
               android:layout_below="@+id/frame1_batteria"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:background="#F2F2F2" >
                 <RelativeLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="#F2F2F2">
             <TextView
              android:id="@+id/text_ricarica_esito"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_below="@+id/text_ricarica"
              android:layout_centerHorizontal="true"
              android:gravity="center_horizontal"
              android:textColor="#78b552"
              android:text="BIBERONAGGIO"
              android:textAppearance="?android:attr/textAppearanceMedium" />

             <TextView
                 android:id="@+id/text_ricarica"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_alignParentTop="true"
                 android:gravity="center_horizontal"
                 android:text="Modalità di ricarica"
                 android:textAppearance="?android:attr/textAppearanceMedium" />

          </RelativeLayout>
               
   </FrameLayout>
   
    <!--  Frame per il posizionamento dell'immagine "Ciclo di vita" -->
           <FrameLayout
               android:id="@+id/frame3_batteria"
               android:layout_below="@+id/frame2_batteria"
              android:layout_toRightOf="@+id/frame4_batteria"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:background="#F2F2F2" >

          <ImageView
              android:id="@+id/cicloVita"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_horizontal|center_vertical"
              android:background="@drawable/ciclo_di_vita"/>
   </FrameLayout>
   
        <FrameLayout
               android:id="@+id/frame4_batteria"
               android:layout_below="@+id/frame2_batteria"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="#F2F2F2" >
         
            <RelativeLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:gravity="center_horizontal|center_vertical"
                            android:background="#F2F2F2">
                 
                  <TextView
                                       android:id="@+id/text_vitaResidua"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                       android:gravity="center_vertical|center_horizontal"
                                       android:text="Vita Residua"
                                       android:textAppearance="?android:attr/textAppearanceMedium" />
                  <TextView
                                       android:id="@+id/text_livellocaricaRicevuto"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                       android:layout_below="@+id/text_vitaResidua"
                                       android:gravity="center_vertical|center_horizontal"
                                       android:text="60.000 km"
                                       android:textAppearance="?android:attr/textAppearanceMedium" />
                 
                 
                  </RelativeLayout>
    </FrameLayout>

</RelativeLayout>