Uso correttamente di una applicazione in landscape

di il
7 risposte

Uso correttamente di una applicazione in landscape

Salve ragazzi sto sviluppando una calcolatrice, ho un problema per quanto riguarda la modalità in landscape,in sostanza quando ho il terminale in questa modalità tutta la grafica che ho creato tramite l'xml viene formattata malissimo,(non si vedono più i pulsanti), vi linko sia l'xml che il codice
grazie mille

<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="wrap_content" 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$PlaceholderFragment">

    <TextView
        android:id="@+id/display"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/material_deep_teal_200"/>
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/display"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="266dp">
        <Button
            android:id="@+id/piu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="+"
            />
        <Button
            android:id="@+id/meno"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="-"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@id/piu" />
        <Button
            android:id="@+id/per"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="*"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@+id/meno" />
        <Button
            android:id="@+id/diviso"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@id/per"
            android:text="/"/>
        <Button
            android:id="@+id/uno"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/piu"
            android:text="1"/>
        <Button
            android:id="@+id/due"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/piu"
            android:layout_toEndOf="@+id/uno"
            android:text="2"/>
        <Button
            android:id="@+id/tre"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/piu"
            android:layout_toEndOf="@+id/due"
            android:text="3"/>
        <Button
            android:id="@+id/radice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/piu"
            android:layout_toEndOf="@+id/tre"
            android:text="radix"/>
        <Button
            android:id="@+id/quattro"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/uno"
            android:text="4"/>
        <Button
            android:id="@+id/cinque"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/due"
            android:layout_toEndOf="@+id/quattro"
            android:text="5"/>
        <Button
            android:id="@+id/sei"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tre"
            android:layout_toEndOf="@+id/cinque"
            android:text="6"/>
        <Button
            android:id="@+id/modulo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="mod"
            android:layout_above="@+id/nove"
            android:layout_toEndOf="@+id/sei" />
        <Button
            android:id="@+id/sette"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/quattro"
            android:text="7"/>
        <Button
            android:id="@+id/otto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="8"
            android:layout_below="@+id/cinque"
            android:layout_alignStart="@+id/cinque" />
        <Button
            android:id="@+id/nove"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="9"
            android:layout_below="@id/sei"
            android:layout_toEndOf="@id/otto" />
        <Button
            android:id="@+id/zero"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:layout_below="@+id/modulo"
            android:layout_toEndOf="@id/nove"
             />
        <Button
            android:id="@+id/uguale"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/sette"
            android:text="="
            android:layout_alignParentBottom="true"
            android:layout_toStartOf="@+id/zero" />
        <Button
            android:id="@+id/cancella"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/zero"
            android:layout_toEndOf="@id/uguale"
            android:layout_alignParentBottom="true"
            android:text="c"/>

    </RelativeLayout>

</RelativeLayout>

codice:

package com.example.broke.calcolatrice30;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView display = (TextView) findViewById(R.id.display);
        final double[] primo = new double[1];
        final double[] secondo = new double[1];
        final String[] simbolo = {new String()};
        Button zero = (Button) findViewById(R.id.zero);
        Button uno = (Button) findViewById(R.id.uno);
        Button due = (Button) findViewById(R.id.due);
        Button tre = (Button) findViewById(R.id.tre);
        Button quattro = (Button) findViewById(R.id.quattro);
        Button cinque = (Button) findViewById(R.id.cinque);
        Button sei = (Button) findViewById(R.id.sei);
        Button sette = (Button) findViewById(R.id.sette);
        Button otto = (Button) findViewById(R.id.otto);
        Button nove = (Button) findViewById(R.id.nove);

        final View.OnClickListener scriviNumero = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String numero = ((Button) v).getText().toString();
                display.setText(display.getText() + numero);
                display.refreshDrawableState();
            }
        };

        zero.setOnClickListener(scriviNumero);
        uno.setOnClickListener(scriviNumero);
        due.setOnClickListener(scriviNumero);
        tre.setOnClickListener(scriviNumero);
        quattro.setOnClickListener(scriviNumero);
        cinque.setOnClickListener(scriviNumero);
        sei.setOnClickListener(scriviNumero);
        sette.setOnClickListener(scriviNumero);
        otto.setOnClickListener(scriviNumero);
        nove.setOnClickListener(scriviNumero);

        final View.OnClickListener cancellaTutto = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                display.setText("");
                primo[0] = 0;
                secondo[0] = 0;
            }
        };
        Button cancella = (Button) findViewById(R.id.cancella);
        cancella.setOnClickListener(cancellaTutto);

        final View.OnClickListener prendiSimbolo = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try{
                simbolo[0] = ((Button) v).getText().toString();
                if(simbolo[0].equals("-"))
                    display.setText("-");
                else {
                    primo[0] = Double.parseDouble(display.getText().toString());
                    display.setText("");
                    display.refreshDrawableState();
                }
                }catch (Exception e){
                    Toast.makeText(getApplicationContext(),"operazione non valida",Toast.LENGTH_SHORT).show();
                }

            }
        };
        Button per = (Button) findViewById(R.id.per);
        Button diviso = (Button) findViewById(R.id.diviso);
        Button meno = (Button) findViewById(R.id.meno);
        Button piu = (Button) findViewById(R.id.piu);
        Button modulo = (Button) findViewById(R.id.modulo);
        per.setOnClickListener(prendiSimbolo);
        diviso.setOnClickListener(prendiSimbolo);
        meno.setOnClickListener(prendiSimbolo);
        piu.setOnClickListener(prendiSimbolo);
        modulo.setOnClickListener(prendiSimbolo);

        final View.OnClickListener radiceListener= new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String ris = display.getText().toString();
                    double r = Double.parseDouble(ris);
                    display.setText("" + Math.sqrt(r));
                    display.refreshDrawableState();
                }catch (Exception e){
                    Toast.makeText(getApplicationContext(),"operazione non valida. Seleziona prima il numero",Toast.LENGTH_SHORT).show();
                }
            }
        };
        Button radice =(Button)findViewById(R.id.radice);
        radice.setOnClickListener(radiceListener);

        final View.OnClickListener ugualeListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                secondo[0] =Double.parseDouble(display.getText().toString());
                if(simbolo[0].equalsIgnoreCase("+"))
                    display.setText(""+(primo[0] + secondo[0]));
                if(simbolo[0].equalsIgnoreCase("-"))
                    display.setText(""+(primo[0] - secondo[0]));
                if(simbolo[0].equalsIgnoreCase("*"))
                    display.setText(""+(primo[0] * secondo[0]));
                if(simbolo[0].equalsIgnoreCase("/"))
                    display.setText(""+(primo[0] / secondo[0]));
                if(simbolo[0].equalsIgnoreCase("-"))
                    display.setText(""+(primo[0] - secondo[0]));
                if(simbolo[0].equalsIgnoreCase("mod"))
                    display.setText(""+(primo[0] % secondo[0]));
                }
        };
        Button uguale= (Button)findViewById(R.id.uguale);
        uguale.setOnClickListener(ugualeListener);

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
p.s. se qualcuno mi può anche spiegare il fix che mi ha proposto l'ide di cambiare le variabili primo,secondo e simbolo in vettori(non ho seguito il fix e il codice crashava,inserendo il fix funziona, ma non credo che sia una soluzione corretta...)
grazie mille

7 Risposte

  • Re: Uso correttamente di una applicazione in landscape

    Le variabili primo, secondo e simbolo non è necessario che siano degli array, ma possono essere variabili "semplici".

    Per quanto riguarda il layout il motivo per cui non vedi i pulsanti è che il layout è troppo lungo per stare in 1 unica schermata, per cui dovresti mettere tutto dentro ad una ScrollView per poter scrollare verso l'alto o il basso.
    Invece non ti da un errore sull'attributo android:screenOrientation="landscape"? In teoria dovrebbe essere un attributo del solo tag <activity>, per cui mettendolo dentro ad un <RelativeLayout> dovrebbe segnalarti un errore, no?
  • Re: Uso correttamente di una applicazione in landscape

    Scusami sono un novellino su Android potresti farmi un esempio quando dici di mettere tutto in una ScrollView ?? ,per quanto riguarda il "trasformare" primo secondo e simbolo in semplici variabili non me lo concede l'ide se ci provo già nel metodo cancellaTutto mi dice di trasformare le variabili in array di uno o di cancellare la linea appena scritta
    per esempio:
    
    final Double primo=0;
    .
    .
    .
     final View.OnClickListener cancellaTutto = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    display.setText("");
                    primo= 0;// mi dice rimuovi la riga o trasformala in un array di un elemento 
                    secondo = 0;
                }
            };
    
  • Re: Uso correttamente di una applicazione in landscape

    Per la scroll view è molto facile:
    
    <ScrollView ...>
    
        <RelativeLayout ...>
            ....
        </RelativeLayout>
    
    
    </ScrollView>
    
    Per quanto riguarda la variabile il problema è che final significa che è una costante, per cui non puoi cambiarne il valore una volta che lo assegni.
  • Re: Uso correttamente di una applicazione in landscape

    Grazie mille ma anche rimuovendo il final il problema rimane non riesco proprio a capire il perché
  • Re: Uso correttamente di una applicazione in landscape

    Giusto, il problema è che cerchi di accedere una variabile da una anonymous inner class, per cui potrebbero esserci comportamenti strani se la variabile venisse modificata. Per risolvere il tuo problema potresti organizzare meglio il codice, ad esempio creando dei getter/setter
  • Re: Uso correttamente di una applicazione in landscape

    Grazie mille appena posso faccio questi aggiustamenti e ti faccio sapere
  • Re: Uso correttamente di una applicazione in landscape

    Colgo l'occasione di ringraziare tutti coloro che mi avevano dato consigli in questa discussione,ho seguito i vostri consigli ma andando avanti ho avuto un nuovo problema con i layout, la mia domanda questa è giusto per una app che deve funzionare sia in landscape che in poportrait creare sempre due layout distinti? (cosa che io adesso faccio per ogni applicazione )oppure è possibile riuscire a riadattare il layout che si è creato magari in portrait ad un eventuale landscape senza l'uso di scroll view? grazie mille
Devi accedere o registrarti per scrivere nel forum
7 risposte