2015-07-03 10 views
5

Ho creato un esempio di progetto di attività Android Wear in Android Studio v1.2.2. Ho cancellato WatchViewStub e usato this example per creare attività con BoxInsetLayout. Ma BoxInsetLayout non funziona correttamente su Round Device. E ho provato questo su moto 360 Android 5.1.1 e prima dell'aggiornamento su Moto 360 versione 5.0.1. E ho provato questo su emulatore. E non funziona affatto. Tutto volta che vedo questo:BoxInsetLayout non funziona

, ma deve essere questo

mio codice qui sotto:

activity_main.xml

<android.support.wearable.view.BoxInsetLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:padding="15dp"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="5dp" 
     android:background="@color/red" 
     app:layout_box="all"> 

     <TextView 
      android:gravity="center" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent" 
      android:text="Hello Android Wear" 
      android:textColor="@color/black" /> 

     <ImageButton 
      android:background="@drawable/selector_btn_ok" 
      android:layout_gravity="bottom|start" 
      android:layout_height="50dp" 
      android:layout_width="50dp" /> 

     <ImageButton 
      android:background="@drawable/selector_btn_cancel" 
      android:layout_gravity="bottom|end" 
      android:layout_height="50dp" 
      android:layout_width="50dp" /> 
    </FrameLayout> 
</android.support.wearable.view.BoxInsetLayout> 

MainActivity.class

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

modulo build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "mypackagename.boxinsetlayout" 
     minSdkVersion 20 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.google.android.support:wearable:1.2.0' 
    compile 'com.google.android.gms:play-services-wearable:7.5.0' 
} 

Perché non funziona? Dove ho sbagliato? E come posso usare correttamente BoxInsetLayout su dispositivi con schermo rotondo?

risposta

2

L'errore è nel vostro activity_main.xml, dove è stato specificato:

android:padding="15dp" 

Se si rimuove questo, allora dovrebbe funzionare. BoxInsetLayout utilizza il riempimento nell'implementazione e il valore che ha restituito l'output errato è stato modificato.

(modifica) È importante notare che BoxInsetLayout regola il riempimento sia in se stesso che nelle viste secondarie. Quindi assicurati di non modificare i valori del padding o le cose si romperanno. Puoi provare ad incorporare un secondo FrameLayout se vuoi avere più controllo sul padding.

+0

Grazie per il supporto! Forse sai perché anche il padding non funziona in FrameLayout? – Malder

+0

Questo non funziona affatto per me. Ho copypasted questo xml nel mio progetto, ma ottengo lo stesso risultato senza inset. –

+1

Grazie. Ma su http://developer.android.com/training/wearables/ui/layouts.html#same-layout la documentazione spiega perché 'BoxInsetLayout' ha bisogno di un padding di 15dp. Google ha bisogno di correggere la guida –

1

ho rimosso android:padding="15dp " da BoxInsetLayout come Wayne Piekarski detto Ora BoxInsetLayout funziona correttamente, ma ho avuto un nuovo problema:.. android:padding="5dp" in FrameLayout non funziona ho sperimentato con activity_layout e ho aggiunto id e modificate imbottitura a 20dp ed ho ottenuto questo risultato per il secondo round e schermo quadrato:

Square screenRound Screen

il mio codice XML per questo

<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/first_frame_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/red" 
     android:padding="20dp" 
     app:layout_box="all"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:text="Hello Android Wear" 
      android:textColor="@color/black" /> 

     <ImageButton 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_gravity="bottom|start" 
      android:background="@drawable/selector_btn_ok" /> 

     <ImageButton 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_gravity="bottom|end" 
      android:background="@drawable/selector_btn_cancel" /> 
    </FrameLayout> 
</android.support.wearable.view.BoxInsetLayout> 

Quindi, imbottitura non funziona in FrameLayout con id first_frame_layout. Ma nella documentazione ufficiale Si può leggere su android:padding="5dp" in FrameLayout

Questa linea assegna padding all'elemento FrameLayout interno. Questo padding si applica a entrambi gli schermi quadrati e rotondi. La spaziatura totale tra i pulsanti e gli inserti finestra è di 20 dp su schermi quadrati (15 + 5) e 5 dp su schermi rotondi.

Per soluzione rapida a questo problema: ho aggiunto nuovo FrameLayout con id second_frame_layout come un bambino per FrameLayout con id first_frame_layout. Ho cancellato il riempimento da first_frame_layout e aggiunto padding="5dp" a second_frame_layout. Ho ottenuto questo risultato:

Good Square screenGood Round screen

finale activity_main.xml

<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/first_frame_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/red" 
     app:layout_box="all"> 

     <FrameLayout 
      android:id="@+id/second_frame_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/green" 
      android:padding="5dp"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:text="Hello Android Wear" 
       android:textColor="@color/black" /> 

      <ImageButton 
       android:layout_width="50dp" 
       android:layout_height="50dp" 
       android:layout_gravity="bottom|start" 
       android:background="@drawable/selector_btn_ok" /> 

      <ImageButton 
       android:layout_width="50dp" 
       android:layout_height="50dp" 
       android:layout_gravity="bottom|end" 
       android:background="@drawable/selector_btn_cancel" /> 
     </FrameLayout> 
    </FrameLayout> 
</android.support.wearable.view.BoxInsetLayout> 

Now. Funziona come voglio sugli schermi Square e Round.

+0

BoxInsetLayout utilizza trucchi con riempimento sia in sé, sia nel bambino. Non dovresti cambiare questi valori di riempimento o le cose si rompono, come hai visto. Il modo migliore che ho visto per aggirare questi problemi è quello di incorporare un secondo FrameLayout come suggerito qui, e regolare il riempimento di quello. –

+4

@WaynePiekarski è [questa documentazione] (https://developer.android.com/training/wearables/ui/layouts.html#same-layout), menzionata nella domanda, semplicemente superata allora? – stkent

+0

Oppure, in alternativa, questo errore non gestisce correttamente il riempimento di una regressione recente? – stkent