Autore Topic: Risoluzione layout in DP  (Letto 606 volte)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Risoluzione layout in DP
« il: 05 Gennaio 2015, 22:37:01 CET »
0
Con i metodi getHeight() e getWidth() di Canvas si possono sapere le dimensioni in pixel di una superficie disegnabile (correggetemi se sbaglio), come si fa' a sapere le dimensioni in DP di un Layout?
Sia che si tratti di tutto lo schermo sia che si tratti di un Layout dentro altri Layout?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #1 il: 07 Gennaio 2015, 12:17:23 CET »
0
Finora non ho ricevuto risposta, qualcuno puo' rispondere?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #2 il: 08 Gennaio 2015, 12:23:06 CET »
0
Finora non ho ricevuto nessuna risposta, qualcuno puo' rispondere?

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:Risoluzione layout in DP
« Risposta #3 il: 08 Gennaio 2015, 17:24:13 CET »
0
Non sono sicuro di aver capito la domanda, o quanto meno cosa intendi per Layout...

però data una View puoi ottenerne le dimensioni con getLayoutParams.

Per convertire la dimensione in DP puoi usare getDisplayMetrics

Codice (Java): [Seleziona]
LayoutParams lp = myView.getLayoutParams();
float density = context.getResources().getDisplayMetrics().density;

float dpWidth = lp.width * density;
float dpHeight = lp.height * density;
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 oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #4 il: 08 Gennaio 2015, 20:29:49 CET »
0
Grazie per la risposta.
Ottenuta la lunghezza di un layout in DP, come faccio a impostare a RUN-TIME la posizione di un'altro layout (quello che da file XML si imposta con la proprieta' "android:layout_marginTop") ?

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:Risoluzione layout in DP
« Risposta #5 il: 08 Gennaio 2015, 21:08:30 CET »
0
Dunque:

Quando invochi getLayoutParams ottieni un oggetto la cui classe dipende dal contenitore della View.

Se il contenitore è un LinearLayout ottieni un LinearLayout.LayoutParams, se è un RelativeLayout ottieni un RelativeLayout.LayoutParams, e così via. In ogni caso si tratta di una classe derivata da ViewGroup.LayoutParams

Questo perché in base al suo contenitore una View ottiene differenti attributi. Se è contenuta in un LinearLayout avrà ad esempio l'attributo "layout_weight", mentre se è contenuta in un RelativeLayout avrà ad esempio l'attributo "layout_alignParentRight".

La maggior parte dei LayoutParams (ma non tutti, credo) ereditano anche da ViewGroup.MarginLayoutParams, per cui posseggono gli attributi "layout_marginTop" e compagnia.

Quindi puoi fare:

Codice (Java): [Seleziona]
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)myView.getLayoutParams();

lp.topMargin = 145; //In pixel!

myView.setLayoutParams(lp);

La prima riga potrebbe restituire un errore di cast non valido. Questo significa che il contenitore della tua View non permette di impostare i margini.
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 oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #6 il: 10 Gennaio 2015, 17:48:53 CET »
0
Il seguente programma dovrebbe visualizzare le dimensioni di DP di una TextView, e invece mi da valori ERRATI (addirittura numeri negativi).
Dove sbaglio?

********** MainActivity.java **********
Codice (Java): [Seleziona]
package com.prove.myapplication14;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity
{
    float densita,dpWidth,dpHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void scriviDati()
    {
        String s="densita="+densita+" \ndpWidth="+dpWidth+" \ndpHeight="+dpHeight;

        TextView tv=(TextView) findViewById(R.id.testo4); tv.setText(s);
    }

    public void onResume()
    {
        super.onResume();

        LinearLayout myView=(LinearLayout) findViewById(R.id.linearLayout1);
        ViewGroup.LayoutParams lp = myView.getLayoutParams();

        densita = getResources().getDisplayMetrics().density;

        dpWidth = lp.width * densita;
        dpHeight = lp.height * densita;

        //Toast.makeText(MainActivity.this,"width="+lp.width,Toast.LENGTH_SHORT).show();
        scriviDati();
    }
}

********** activity_main.xml **********
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

    <LinearLayout
       android:id="@+id/linearLayout1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
        <TextView
           android:text="Testo 1"
           android:id="@+id/testo1"
           android:gravity="center"
           android:layout_width="match_parent"
           android:layout_height="wrap_content" />

    </LinearLayout>

    <TextView
       android:text="Testo 2"
       android:id="@+id/testo2"
       android:layout_marginTop="30dp"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

    <TextView
       android:text="Testo 3"
       android:id="@+id/testo3"
       android:layout_marginTop="60dp"
       android:gravity="center"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

    <TextView
       android:text="Testo 4"
       android:id="@+id/testo4"
       android:layout_marginTop="90dp"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

</RelativeLayout>

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:Risoluzione layout in DP
« Risposta #7 il: 10 Gennaio 2015, 18:54:50 CET »
0
Nella onResume le viste non sono ancora state "misurate": ne esiste una rappresentazione gerarchica in memoria, ma i calcoli sulle dimensioni effettive avvengono più tardi.

Per intercettare quando ciò avviene puoi registrare un callback utilizzando il ViewTreeObserver della tua vista.

Codice (Java): [Seleziona]
TextView tv=(TextView) findViewById(R.id.testo4);
ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      dpWidth = view.getWidth();
      dpHeight = view.getHeight();
    }
  });
}

Comunque, al di là delle risposte, mi permetto di dirti che forse non stai facendo la cosa giusta. La rappresentazione degli oggetti sullo schermo in Android avviene in modo fortemente asincrono, e di solito ogni View è responsabile della rappresentazione delle altre viste che contiene: questo significa che l'Activity non dovrebbe intervenire nella sua rappresentazione se non definendo dei parametri che poi ogni vista applica in modo asincrono.

Posso chiederti perché hai bisogno di misurare la larghezza di una TextView?
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 oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #8 il: 10 Gennaio 2015, 19:27:23 CET »
0
Ti espongo il mio problema.

Ho un RelativeLayout (NON vorrei usare al suo posto un LinearLayout) con delle TextView, la lunghezza del testo delle TextView e' variabile; vorrei che la SECONDA TextView fosse posta ESATTAMENTE SOTTO la prima TextView, ma non so' di quanti DP spostarla in basso (come gia' detto la lunghezza della prima TextView e' variabile).

Come posso fare?
Dimmi se mi sono spiegato bene.
Ciao e grazie.

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:Risoluzione layout in DP
« Risposta #9 il: 10 Gennaio 2015, 20:29:45 CET »
0
Ho capito male oppure la soluzione è banale.

Usa l'attributo android:layout_below:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >
   
    <TextView
       android:id="@+id/ieiName"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       
       android:text="@string/app_name"
                />

    <!-- Questo testo apparirà esattamente sotto al precedente -->
    <TextView
       android:id="@+id/ieiDescription"
       
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/ieiName"
       
       android:text="@string/app_name"
       />
   
</RelativeLayout>

Allo stesso modo (ma con altri attributi, ovviamente) puoi:
  • Porre alla destra o alla sinistra o sopra o sotto di un'altra View
  • Allineare a destra, sinistra, sopra o sotto di un'altra View
  • Allineare in alto, in basso, a destra, a sinistra, al centro del parent
  • Altro
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 oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Risoluzione layout in DP
« Risposta #10 il: 10 Gennaio 2015, 20:50:25 CET »
0
Nel mio programma da una activity si inserisce del testo, e da un'altra activity viene mostrato il testo DUE volte, una volta come e' stato inserito e una volta cifrato; ho bisogno di sapere l'altezza della TextView per calcolare la massima LUNGHEZZA (in caratteri) del testo da inserire.

In cima alla seconda activity ci sono i due testi e, in fondo, dei bottoni; ho bisogno da sapere l'altezza delle TextView per calcolare quanti caratteri (al massimo) puo' essere lungo il testo da inserire nella prima activity.

Dimmi se mi sono spiegato bene.

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:Risoluzione layout in DP
« Risposta #11 il: 10 Gennaio 2015, 21:12:19 CET »
+1

Non dovresti farti limitare dallo spazio a disposizione.

Sia la prima che la seconda activity possono essere realizzate in modo da poter scorrere, cosicché il testo in eccesso può essere letto semplicemente scorrendo.

Non ti sto dicendo che quello che vuoi ottenere sia sbagliato, dico solo che è difficile perché Android è concepito secondo un paradigma differente.

Misurare un TextView per sapere quanto spazio può contenere è piuttosto complesso perché è un'operazione che dovrebbe risultare superflua: metti il testo nello spazio disponibile, se lo spazio non basta il testo si abbrevia o si fa scorrere.

Per quanto riguarda l'inserimento il problema non esiste perché le EditText già permettono di inserire un testo più lungo dello spazio disponibile.

Per la seconda activity potresti organizzarti così:

<RelativeLayout>
  <ScrollView>
    <RelativeLayout>
      <TextView /> <- Testo normale, multilinea
      <TextView /> <- Testo cifrato, multilinea, sotto al testo normale con android:layout_below
    </RelativeLayout>
  </ScrollView>
  <Button /> <- Primo tasto, allineato in basso, sotto allo scrollview tramite android:layout_below
  <Button /> <- Secondo tasto, allineato in basso
</RelativeLayout>

In modo che i due testi, uno sopra l'altro, siano scrollabili (nel caso lo spazio non basti). I tasti, fuori dallo scrollview, restano fissi in basso allo schermo.
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.