Autore Topic: Rendere un'App disponibile anche in LandScape  (Letto 335 volte)

Offline carbos

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3 Neo
  • Sistema operativo:
    Windows10
Rendere un'App disponibile anche in LandScape
« il: 21 Febbraio 2016, 23:00:35 CET »
0
Dopo aver sviluppato la mia App in portrait, sto cercando di svilupparla anche in Landscape, ecco il codice in portrait, il fatto è che mi spunta errore quando metto il mio cellulare in landscape, poi da considerare che io utilizzo AndroidStudio e ho creato un altra cartella layout-land dove ho copiato e incollato activity_main.xml e (poi modificato) content_main.xml, come devo fare? Ho visto qualche source su internet, e ho visto che comunque usano due cartelle (layout e layout-land):
layout/content_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   app:layout_behavior="@string/appbar_scrolling_view_behavior"
   tools:context="com.carbos.user.AnimeListApp.MainActivity"
   tools:showIn="@layout/activity_main"
   android:background="#1E90FF">

    <FrameLayout
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/list_anime"/>
</RelativeLayout>

Mentre il layout che uso per il portrait è questo:
layout-land/content_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   app:layout_behavior="@string/appbar_scrolling_view_behavior"
   tools:context="com.carbos.user.AnimeListApp.MainActivity"
   tools:showIn="@layout/activity_main"
   android:background="#1E90FF"
   android:orientation="horizontal">

    <fragment
       android:name="com.carbos.user.animelistapp.ListAnime"
       android:layout_height="wrap_content"
       android:layout_width="0dp"
       android:id="@+id/list_anime_land"
       android:layout_weight="1"/>
    <fragment
       android:name="com.carbos.user.animelistapp.AnimeDesc"
       android:layout_height="wrap_content"
       android:layout_width="0dp"
       android:id="@+id/desc_anime_land"
       android:layout_weight="2"/>
</LinearLayout>

l'Errore:
Citazione
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager: No view found for id 0x7f0c006a (com.carbos.user.animelistapp:id/list_anime) for fragment ListAnime{42687430 #4 id=0x7f0c006a}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager: Activity state:
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:   Local FragmentActivity 426743a0 State:
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     mCreated=falsemResumed=false mStopped=false mReallyStopped=false
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     mLoadersStarted=false
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:   FragmentManager misc state:
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     mHost=android.support.v4.app.FragmentActivity$HostCallbacks@426745f0
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     mContainer=android.support.v4.app.FragmentActivity$HostCallbacks@426745f0
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     mCurState=1 mStateSaved=false mDestroyed=false
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:   View Hierarchy:
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:     com.android.internal.policy.impl.PhoneWindow$DecorView{42675498 V.E..... ... 0,0-0,0}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:       android.widget.LinearLayout{42675c98 V.E..... ... 0,0-0,0}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:         android.view.ViewStub{42676820 G.E..... ... 0,0-0,0 #10203b0}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:         android.widget.FrameLayout{42676b80 V.E..... ... 0,0-0,0}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:           android.support.v7.widget.FitWindowsLinearLayout{426799f8 V.E..... ... 0,0-0,0 #7f0c0055 app:id/action_bar_root}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:             android.support.v7.widget.ViewStubCompat{42679df0 G.E..... ... 0,0-0,0 #7f0c0056 app:id/action_mode_bar_stub}
02-21 22:53:39.080 32428-32428/com.carbos.user.animelistapp E/FragmentManager:             
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager: android.support.v7.widget.ContentFrameLayout{4267a410 V.ED.... ... 0,0-0,0 #1020002 android:id/content}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:               android.support.design.widget.CoordinatorLayout{4267aed0 V.E..... ... 0,0-0,0}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                 android.support.design.widget.AppBarLayout{4267b570 V.E..... ... 0,0-0,0}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                   android.support.v7.widget.Toolbar{4267bb50 V.E..... ... 0,0-0,0 #7f0c0069 app:id/toolbar}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                     android.widget.TextView{426868c8 V.ED.... ... 0,0-0,0}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                 android.widget.LinearLayout{4267cb88 V.E..... ... 0,0-0,0}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                   android.widget.FrameLayout{4267e538 V.E..... ... 0,0-0,0 #7f0c006b app:id/list_anime_land}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                     android.widget.ListView{4267f128 VFED.VC. ... 0,0-0,0 #7f0c0076 app:id/listanime}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                   android.widget.RelativeLayout{42681e20 V.E..... ... 0,0-0,0 #7f0c006c app:id/desc_anime_land}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                     android.support.v7.widget.AppCompatTextView{42682358 V.ED.... ... 0,0-0,0 #7f0c0043 app:id/title}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                     
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager: android.widget.RelativeLayout{42683ce0 V.E..... ... 0,0-0,0 #7f0c0074 app:id/container_image}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                       android.support.v7.widget.AppCompatImageView{42684358 V.ED.... ... 0,0-0,0 #7f0c003f app:id/image}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/FragmentManager:                     android.support.v7.widget.AppCompatTextView{426848a0 V.ED.... ... 0,0-0,0 #7f0c0075 app:id/desc}
02-21 22:53:39.090 32428-32428/com.carbos.user.animelistapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.carbos.user.animelistapp, PID: 32428
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carbos.user.animelistapp/com.carbos.user.animelistapp.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f0c006a (com.carbos.user.animelistapp:id/list_anime) for fragment ListAnime{42687430 #4 id=0x7f0c006a}
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
                                                                                  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947)
                                                                                  at android.app.ActivityThread.access$1000(ActivityThread.java:169)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:136)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5476)
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
                                                                                  at dalvik.system.NativeStart.main(Native Method)
                                                                               Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0c006a (com.carbos.user.animelistapp:id/list_anime) for fragment ListAnime{42687430 #4 id=0x7f0c006a}
                                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:882)
                                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
                                                                                  at android.app.BackStackRecord.run(BackStackRecord.java:684)
                                                                                  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453)
                                                                                  at android.app.Activity.performStart(Activity.java:5460)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2301)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
                                                                                  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) 
                                                                                  at android.app.ActivityThread.access$1000(ActivityThread.java:169) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                  at android.os.Looper.loop(Looper.java:136) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5476) 
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
                                                                                  at dalvik.system.NativeStart.main(Native Method) 

Mentre il MainActivity.java è questo:
Codice (Java): [Seleziona]
package com.carbos.user.animelistapp;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity implements ListAnime.OnFragmentInteractionListener{
    private FragmentManager fm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ListAnime a = ListAnime.newInstance("a", "b");
        ft.add(R.id.list_anime, a).addToBackStack("Anime");
        ft.commit();
    }

    @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);
    }

    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 1 ){
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }

    public void onClickAnime(int i){
        FragmentTransaction ft = fm.beginTransaction();
        AnimeDesc Desc = AnimeDesc.newInstance(i);
        ft.replace(R.id.list_anime, Desc);
        ft.addToBackStack("Anime");
        ft.commit();
    }
}

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Rendere un'App disponibile anche in LandScape
« Risposta #1 il: 22 Febbraio 2016, 08:10:09 CET »
0
Non devi creare un fragment solo perché vuoi una versione landscape. Ti basta avere un altro xml in layout land e basta.

Offline carbos

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3 Neo
  • Sistema operativo:
    Windows10
Re:Rendere un'App disponibile anche in LandScape
« Risposta #2 il: 22 Febbraio 2016, 12:12:00 CET »
0
Non devi creare un fragment solo perché vuoi una versione landscape. Ti basta avere un altro xml in layout land e basta.
Potresti farmi un esempio?
Poi ho visto che con Android studio se clikki su rappresenta in Land ti crea un altro file XML

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Rendere un'App disponibile anche in LandScape
« Risposta #3 il: 22 Febbraio 2016, 12:16:17 CET »
0
Invece di mettere 2 fragment ne tieni uno e basta.
Crei la cartella layout-land se non ce l' hai.
Ora metti un xml come vuoi tu (per landscape ovviamente) facendo attenzioni ad avere gli stessi id (nelle varie view ) del facile xml presente nella cartella normale layout.

Ha codice java non devi cambiare niente. Devi scrivere codice indipendentemente dai layout. Pero ricorda che gli id devono essere uguali.
Per esempio in mainacticity hai una listview che ottieni con findViewById(R.id.mylistview).

Bene. Sia nel xml di layout che nel xml di layout-land la listview deve comunque avere quel id.

Offline carbos

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3 Neo
  • Sistema operativo:
    Windows10
Re:Rendere un'App disponibile anche in LandScape
« Risposta #4 il: 22 Febbraio 2016, 15:38:47 CET »
0
Invece di mettere 2 fragment ne tieni uno e basta.
Crei la cartella layout-land se non ce l' hai.
Ora metti un xml come vuoi tu (per landscape ovviamente) facendo attenzioni ad avere gli stessi id (nelle varie view ) del facile xml presente nella cartella normale layout.

Ha codice java non devi cambiare niente. Devi scrivere codice indipendentemente dai layout. Pero ricorda che gli id devono essere uguali.
Per esempio in mainacticity hai una listview che ottieni con findViewById(R.id.mylistview).

Bene. Sia nel xml di layout che nel xml di layout-land la listview deve comunque avere quel id.

il fatto è che in Portrait i fragment si sostituiscono, mentre in Landscape, devono essere uno a fianco all'altro, come posso gestire ciò?