2016-03-28 8 views
0

Ich entwickle eine einfache App, wo Sie eine Liste von Musikern sehen können, und wenn Sie auf einen Musiker klicken, erhalten Sie einige Details darüber (Genre, Top-Hits und Biographie). Die Funktionalität, die ich erreichen möchte, ist dies: Wenn Sie es auf einem großen Bildschirm anzeigen, lassen Sie die Liste der Musiker auf der linken Seite und die Details sollten auf der rechten Seite erscheinen (sobald ein Musiker angeklickt wird); Wenn es sich um einen schmalen Bildschirm handelt, sollten die Details separat auf einem neuen Bildschirm angezeigt werden. Die Funktionalität sollte mit Fragmenten und Framelayouts erreicht werden.Android-Aktivität lädt falsche Layout-Datei

So habe ich die activity_main.xml, und ich ging zu neue Ressource-Datei hinzufügen - automatisch geladen werden auf Landschaft orientierte Smartphones oder Tablets> Layout-Datei und ich activity_main.xml (w600dp) hinzugefügt, die ich erwarte.

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/muzicari_lista" 
     android:layout_weight="1"> 
    </FrameLayout> 

</LinearLayout> 

w600dp/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:id="@+id/lista_muzicara"></FrameLayout> 
    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:id="@+id/detalji_muzicar"></FrameLayout> 
</LinearLayout> 

XML ist von Fragmenten, die die Liste und die Details sind recht einfach mit ein paar Textblöcke enthalten. Hier ist die onCreate Methode der mainActivity Klasse:

protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     unosi = new ArrayList<Muzicar>(); //let's presume there's something in this list 


     wideL = false; 
     FragmentManager fm = getFragmentManager(); 
     //fetching FragmentManager 
     FrameLayout ldetalji = (FrameLayout)findViewById(R.id.detalji_muzicar); 
     if(ldetalji!=null){ 
//layout for wide screens 
      wideL=true; 
      FragmentDetalji fd; 
      fd = (FragmentDetalji)fm.findFragmentById(R.id.detalji_muzicar); 
//checking if there is FragmentDetalji already created: 
      if(fd==null) { 
       //if not, we're creating it now 
       fd = new FragmentDetalji(); 
       fm.beginTransaction().replace(R.id.detalji_muzicar, fd).commit(); 
      } 
     } 

     FragmentLista fl = (FragmentLista)fm.findFragmentByTag("Lista"); 
//we're checking if there's already fl created 

     if(fl==null){ 
      //if it hasn't been created: 
      fl = new FragmentLista(); 
      Bundle argumenti = new Bundle(); 
      argumenti.putParcelableArrayList("Alista",unosi); 
      fl.setArguments(argumenti); 
      fm.beginTransaction().replace(R.id.muzicari_lista, fl).commit(); 
     }else{ 
      //case when we change from portrait to landscape, and there was FragmentDetalji already open 

      fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 
    } 

Klassen FragmentDetalji und FragmentLista nicht viel besonderes tun onCreateView neben nutzen (obwohl ich kann sie hinzufügen, wenn sie die Quelle des Problems sein könnte).

Das Problem ist, dass, egal was ich zum Laden dieser App verwenden, Activity_main wird in seiner Standardform geladen, nicht die w600dp Version! Was mache ich falsch?

+0

Bitte posten Sie Ihre res Ordnerstruktur Screenshot. –

+0

@Shadab Ansari http://prntscr.com/alaq06 activity_pocetni = activity_main. –

+0

Bitte fügen Sie Ihre Manifest-Datei ein. –

Antwort

0

Um alternative Layout-Ressourcen bereitzustellen, müssen Sie ein Unterverzeichnis innerhalb Ihres Res-Ordners mit dem Namen layout-sw600dp erstellen und Ihr geändertes Layout mit dem Namen EXACT wie das andere kleine Bildschirmlayout einfügen. Dann sollte Ihre Aktivität automatisch in diesem Ordner aussehen. Wenn Ihre XML-Datei activity_main.xml heißt, sollte sie genau den gleichen Namen im Ordner layout-sw600dp haben.

Sie können auch alternative Layouts für Querformat bereitstellen, indem Sie ein Unterverzeichnis namens layout-land oder layout-sw600dp-land für einen großen Bildschirm erstellen.

Beachten Sie auch, dass es Unterschiede zwischen sw600dp und w600dp mit - Sehen Sie diese Frage für weitere Informationen: Difference between sw600dp and w600dp?

+0

Android Studio hat dies für mich automatisch getan. Ich verstehe es einfach nicht, warum wird es nicht geladen. –

+0

Wenn Sie möchten, dass sich das Layout ändert, wenn der Benutzer den Bildschirm dreht, müssen Sie stattdessen "Layout-Land" verwenden. Wenn Sie nur möchten, dass das Layout auf größeren Bildschirmen anders aussieht, verwenden Sie 'sw600dp' und nicht' w600dp'. Siehe die Frage, die ich in meiner Antwort für mehr Informationen über die zwei verknüpfte. – NoChinDeluxe

+0

Ich erwarte, dass es auf fast jedem Bildschirm funktioniert, der breit genug ist, das Landschafts-Smartphone ist nur ein Beispiel, es kann auch ein Tablet sein oder was auch immer. –

Verwandte Themen