2015-01-08 10 views
7

Sto provando a creare un'applicazione con due interfacce utente diverse per tablet e telefoni e sto utilizzando frammenti per implementarlo. Ho creato due file xml separati per ogni layout di tablet e telefono ed entrambi sono chiamati activity_main.xml, con il layout del telefono inserito nella cartella res/layout e il layout della tavoletta posizionato nella cartella res/layout-sw600dp.L'interfaccia utente del tablet non funziona sulla mia app

Tuttavia, quando provo a eseguire la mia app su un emulatore Nexus 10 (Android Studio), si passa automaticamente al layout predefinito del telefono. L'app non si arresta in modo anomalo o altro, ma viene semplicemente eseguita nell'interfaccia utente del telefono quando deve essere eseguita nell'interfaccia utente del tablet. Non so quale possa essere la fonte di questo errore e quindi ogni aiuto sarebbe apprezzato.

Ecco un aggiornamento, ho provato a rinominare la cartella in res/layout-large-mdpi ma non ho ancora trovato alcuna modifica. È possibile che possa avere qualcosa a che fare con l'emulatore?

Ecco il mio manifesto: il layout

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.androidattack.www.sunshine" > 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.androidattack.www.sunshine.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.androidattack.www.sunshine.DetailActivity" 
      android:label="@string/title_activity_detail" 
      android:parentActivityName="com.androidattack.www.sunshine.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.androidattack.www.sunshine.MainActivity" /> 
     </activity> 
     <activity 
      android:name="com.androidattack.www.sunshine.SettingsActivity" 
      android:label="@string/title_activity_settings" 
      android:parentActivityName="com.androidattack.www.sunshine.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.androidattack.www.sunshine.MainActivity" /> 
     </activity> 
     <provider 
      android:authorities="com.androidattack.www.sunshine" 
      android:name=".data.WeatherProvider" /> 
    </application> 

</manifest> 

sw600dp:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:divider="?android:attr/dividerHorizontal" 
    android:baselineAligned="false" 
    tools:context="com.androidattack.www.sunshine.MainActivity"> 

    <fragment 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:name="com.androidattack.www.sunshine.ForecastFragment" 
     android:id="@+id/fragment_forecast" 
     android:layout_gravity="center_vertical" 
     android:layout_weight="1" /> 

    <FrameLayout 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="2" 
     android:id="@+id/weather_detail_container"> 

    </FrameLayout> 


</LinearLayout> 

layout di normale:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment_forecast" 
    android:name="com.androidattack.www.sunshine.ForecastFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    tools:context="com.androidattack.www.sunshine.ForecastFragment" 
    tools:ignore="MergeRootFrame" 
    tools:layout="@android:layout/list_content" /> 

E infine questo è la mia classe MainActivity.java:

/* 
* Copyright (C) 2014 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
package com.androidattack.www.sunshine; 

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 


public class MainActivity extends ActionBarActivity { 

    private final String LOG_TAG = MainActivity.class.getSimpleName(); 
    private boolean mTwoPane; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (findViewById(R.id.weather_detail_container) != null) { 
      // Tablet view 
      mTwoPane = true; 

      // In two-pane mode, show the detail view by adding 
      // or replacing the detail fragment using a 
      // fragment transaction. 

      if (savedInstanceState == null) { 
       getSupportFragmentManager().beginTransaction() 
         .replace(R.id.weather_detail_container, new DetailFragment()) 
         .commit(); 
      } 
     } else { 
      // Phone View 
      mTwoPane = false; 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.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(); 
     if (id == R.id.action_settings) { 
      startActivity(new Intent(this, SettingsActivity.class)); 
      return true; 
     } 
     if (id == R.id.action_map) { 
      openPreferredLocationInMap(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void openPreferredLocationInMap() { 
     SharedPreferences sharedPrefs = 
       PreferenceManager.getDefaultSharedPreferences(this); 
     String location = sharedPrefs.getString(
       getString(R.string.pref_location_key), 
       getString(R.string.pref_location_default)); 

     // Using the URI scheme for showing a location found on a map. This super-handy 
     // intent can is detailed in the "Common Intents" page of Android's developer site: 
     // http://developer.android.com/guide/components/intents-common.html#Maps 
     Uri geoLocation = Uri.parse("geo:0,0?").buildUpon() 
       .appendQueryParameter("q", location) 
       .build(); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setData(geoLocation); 

     if (intent.resolveActivity(getPackageManager()) != null) { 
      startActivity(intent); 
     } else { 
      Log.d(LOG_TAG, "Couldn't call " + location + ", no receiving apps installed!"); 
     } 
    } 
} 
+0

Avete altre cartelle di risorse con qualificatori? Forse uno di questi ha la priorità sulla tua cartella sw600dp? – stkent

+1

hai provato nel dispositivo reale? Nel mio nesso 7, posso archiviarlo con valori-sw6000dp. Forse puoi provare a creare valori di cartella-sw720dp (tablet da 10 ") –

+1

Hai provato layout di grandi dimensioni? Questo è quello che usiamo per differenziare i nostri layout di tablet e telefono. Layout-large ti prende entrambi i tablet da 7" e 10 ", e se hai bisogno di qualcosa di diverso per 10 "puoi usare layout-xlarge. – Bruce

risposta

-2

L'utilizzo di layout-xhdpi funzionerà per questo scenario specifico e un emulatore di tablet Nexus 7 o 10 per il Nanodegree. Non ho mai potuto caricare il layout-sw600dp sul mio emulatore e al momento mantengo Sunshine con un layout-xhdpi e un layout-sw600dp con lo stesso activity_main.xml.

+0

Questo ha lo sfortunato effetto collaterale di rendere alcuni telefoni anche il layout. Ci deve essere una soluzione migliore. –

0

Hai provato cosa succede con il layout quando ruoti il ​​dispositivo? (Ad esempio, come da progetto il sole è necessario creare entrambi i layout-sw600dp-port e il layout-sw600dp)

0

layout sw600dp è per i tablet da 7 pollici/emulatore

layout sw720dp è per i pani da 10 pollici/emulatore

9

Per me, il codice era corretto, ma il problema era con l'emulatore. Se imposti l'emulatore con No skin, dovrebbe funzionare. Rimuovi quella pelle!

+0

davvero un trucco per i principianti – wakandan

Problemi correlati