Android – orientamento dello schermo ricarica attività

im andando a ri-chiedere a questa domanda, perché c’è tanta cattiva informazione là fuori è davvero deprimente. il racconto breve è che io non voglio nulla per modificare o accadere quando il dispositivo cambia orientamento. 2 dei più popolari “solutuions” dato a questo problema sono:

1.Si potrebbe bloccare l’attività di un orientamento da addingandroid:screenOrientation=”portrait” o “landscape”), il manifesto.

2.Si potrebbe dire che il sistema che si intende gestire schermo cambia per te specificando android:configChanges=”screenOrientation” nel tag. In questo modo l’attività non verrà ricreato, ma riceverà un callback invece (che non si può ignorare, come non è utile per voi).

NÉ di quelli di lavoro. così mi permetta di spiegare il mio particolare problema in più in dettaglio…

sto sperimentando con un app MOLTO semplice come un esercizio di apprendimento. ho un file di testo su un server. il file di testo è 1 cosa: un numero intero in una singola riga. questo numero è il numero di file di immagine memorizzati anche su questo server, e le immagini sono tutte di nome 0.jpg, 1.jpg, 2.jpg ecc.

TUTTI il mio codice è nel metodo onCreate della mia attività (come ho detto in un semplice app).

l’app effettua le seguenti operazioni quando viene eseguito:

legge il numero di file di testo.
generare un numero casuale da zero al numero di file.
carica una immagine casuale in una imageview utilizzando il numero casuale nell’URL.

quando lo schermo ruota non voglio che tutto questo accada di nuovo. voglio semplicemente che NULLA accada… tranne che lo schermo dovrebbe obviosuly ruotare e l’immagine adatta, che non. ma ogni volta che lo schermo ruota tutto il codice viene eseguito e casuale di un’immagine è selezionata. per favore qualcuno può darmi una soluzione semplice con il codice di lavoro per risolvere questo problema? ho imparato da vedere così se non si può fornire un esempio di codice che non aiutano.

grazie in anticipo.

ps… non sto cercando un modo diverso di fare quello che sto facendo, non è questo il punto. im cercando di RISOLVERE il modo im attualmente facendo.

Ah, si deve fare qualcosa di sbagliato nel codice: android:configChanges="screenOrientation" È il modo di gestire ciò che si vuole fare. Se hai configurato giusto onCreate NON sarà re-run. Se la sua re-run poi hai configurato male. Metti il tuo codice nel corpo della domanda e sto cercando di indovinare la risposta dovrebbe essere abbastanza semplice.
hhmmm… cosa stai dicendo im configurazione sbagliata? se l’UNICA cosa youre dicendo che devo fare è aggiungere che, a linea singola per il mio manifesto, come potrei essere io a fare il male?
Che è quello che mi sono sicuri e il motivo per cui ho chiesto di vedere il tuo codice. Ho un codice funzionante che non fuoco onCreate() ogni volta che si cambia orientamento.
che parametro è? android:configChanges="orientation" o android:configChanges="screenOrientation"?

InformationsquelleAutor Escobar Ceaser | 2011-05-06

5 risposte

  1. 3

    Una domanda molto simile è qui: Non ricaricare applicazione quando si cambia orientamento

    Comunque, prima di tutto si dovrebbe cambiare il codice onCreate un altro metodo e lo si divide per “creare un numero casuale e caricare l’immagine dalla rete” e “imposta immagine per visualizzare”.

    Si dispone di una Bitmap di attività, che consente di verificare se è null ogni volta che inizia l’attività.

    Se lo è, fare tutto. Se non lo è, basta impostare l’ImageView o quant’altro con la Bitmap che sono.

    Per evitare di distruggere la Bitmap quando ruota utilizzare:

        Bitmap image = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    
     image = (Bitmap) getLastNonConfigurationInstance();
    
         if(bitmap == null){
             image = downloadImage();
          }
         setImage(bitmap);
    }
    
    
    @Override
    public Object onRetainNonConfigurationInstance() {
        return bitmap;
    }

    Questo funziona, io sono sicuro al 100%.

    sì, questo è la MIA domanda. nessuna delle soluzioni di lavoro. persone solo a mantenere questo distacco cose, senza mai testare il codice. un pò ridicolo.
    che JJD la stessa domanda.
    Si noti che i dati si recuperano qui deve essere utilizzato solo come un programma di ottimizzazione per la gestione di modifiche di configurazione. Si dovrebbe sempre essere in grado di gestire per ottenere un puntatore null indietro, e un’attività deve comunque essere in grado di ripristinare lo stato precedente (attraverso il normale onSaveInstanceState(Bundle) meccanismo), anche se questa funzione restituisce null.
    questo è irreale. non posso tornare una bitmap da mio DownLoadImage funzione perché faccio il lavoro in un blocco try/catch. se il “ritorno” è la prova che non è riconosciuta e se il suo try il ritorno non riconoscere la bitmap varialbe che è stato creato NEL provare
    È necessario rivedere Java. È necessario definire la variabile prima di provare di non essere solo la prova contesto Bitmap nome = null; try{ nome = … }catch(Exception e){ … } return nome;

    InformationsquelleAutor neteinstein

  2. 10

    La soluzione utilizzando android:configChanges="orientation" non funzionano a meno che l’applicazione ha un’API di livello 12 o inferiore.

    In API di livello 13 o al di sopra, la dimensione dello schermo cambia quando le modifiche dell’orientamento, quindi questo fa ancora l’attività per essere distrutta e iniziato quando cambia orientamento.

    Semplicemente aggiungere il “screenSize” attributo come ho fatto qui sotto:

    <activity>
        android:name=".YourActivityName"
        android:configChanges="orientation|screenSize">
    </activity>

    Ora, quando il cambiamento di orientamento (di dimensioni di schermo e modifiche), l’attività mantiene il suo stato e onConfigurationChanged() viene chiamato. Questo per evitare tutto ciò che è sullo schermo (vale a dire: pagina web in una Webview) quando l’orientamento chagnes.

    Imparato da questo sito: http://developer.android.com/guide/topics/manifest/activity-element.html

    Inoltre, questo è apparentemente una cattiva pratica in modo di leggere i link qui sotto per la Gestione Runtime Modifiche:

    http://developer.android.com/guide/topics/resources/runtime-changes.html

    Ciao! Sto utilizzando diversi layout per il ritratto e la modalità paesaggio, quindi non posso utilizzare android:configChanges, c’è qualche altra soluzione?

    InformationsquelleAutor corbin

  3. 0

    Per esempio, aggiungere il manifesto:

    <activity android:name=".Explorer" android:label="@string/app_name"
                android:configChanges="orientation" android:launchMode="standard">
            </activity>

    e poi basta ignorare l’impostazione predefinita funzione:

        @Override
            public void onConfigurationChanged(Configuration _newConfig){
                super.onConfigurationChanged(_newConfig);
    int height = getWindowManager().getDefaultDisplay().getHeight();
            int width = getWindowManager().getDefaultDisplay().getWidth();
            if(width > height){
    //layout for landscape
    }else{
    //layout for portrait
            }
                }

    NOTA: se si esegue l’override di questa funzione È necessario rifare il layout. Che è l’unico modo per fare quello che vuoi. Android approccio per la risoluzione del tuo schermo dimensione è far saltare in aria l’intera Attività di distanza e portare di nuovo con le nuove dimensioni. Se si sceglie di non avere il colpo Attività, allora È necessario gestire la dimensione dello schermo cambia. Non ci sono altre opzioni.

    EDIT: In questa particolare app, ho una tabella che mostra in verticale, e un grafico che mostra nel paesaggio. Io faccio questo:

    void showDataView()
        {
            setContentView(mainView);
            currentView = mainView; 
        }
    
        void showGraphView()
        {
            if(currentView == mainView){
                if(graphView == null){
                    setContentView(R.layout.graphview);
                    graphView = (GraphView)findViewById(R.id.graphview);
                }
                setContentView(graphView);
                currentView = graphView;
                graphView.setDataToPlot(DATA_TO_PLOT);
                graphView.clear();
            }
        }
    
    @Override
        public void onConfigurationChanged(Configuration _newConfig){
            super.onConfigurationChanged(_newConfig);
            int height = getWindowManager().getDefaultDisplay().getHeight();
            int width = getWindowManager().getDefaultDisplay().getWidth();
            if(width > height){
                showGraphView();
            }else{
                showDataView();
            }
            if(graphView != null) graphView.setGraphWidth(width);
        }

    Ogni volta che le modifiche dell’orientamento, posso passare il contenuto della vista da uno all’altro. Nel tuo caso, si potrebbe essere in grado di appena invalidate corrente principale Vista e vedere se ti ridisegnare correttamente.

    Questo è il motivo per cui si desidera che la piattaforma per prendersi cura di esso, in modo che si non hanno a che fare con questa merda. Si sarebbe meglio solo con onSaveInstanceState per preservare i dati specifici che è necessario e poi il check-in onCreate per i dati e quindi utilizzarlo. Vedere http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges per informazioni al riguardo.

    ok e dove sto mettendo quel codice? nella mia attività prima onCreate?
    Questa è l’unica vera risposta. Ho trovato che è meglio solo la forza di un orientamento dello schermo e stare con che. Soprattutto se si tratta di qualsiasi tipo di arte asset applicazioni molto pesanti. Ecco perché la maggior parte dei giochi sul marketplace di forza di un orientamento e non consentono di cambiare.
    e cosa devo mettere in “layout per il paesaggio” e “layout per il ritratto” aree?
    Nella vostra Attività: il suo solo un altro Android richiamata come onCreate: è necessario implementare onConfigurationChanged e quindi forzare il nuovo layout. Tutti i suoi dicendo è che, invece di destroying l’attività, quando un orientamento dello schermo si verifica il cambiamento, la chiamata a questa funzione e dovrai rifare il layout. Si potrebbe ottenere via con solo il root Vista e invalidateing.
    non ho ancora idea di che cosa devo fare in if/else sezioni. posso avere un esempio?

    InformationsquelleAutor Femi

  4. 0

    cosa ha funzionato per me è la dichiarazione di una delle variabili di classe come statico.
    si scopre che la classe statica variabili sono inizializzate una volta quando l’applicazione è in fase di caricamento, ma quando l’applicazione viene ricaricato, questi non sarà inizializzato di nuovo.

    queste variabili potrebbe tenere uno stato o di un oggetto che non si vuole reinizializzare.
    Non posso dire che questo non è super elegante, ma provato e ha funzionato per me.

    InformationsquelleAutor mvalenci

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *