2015-06-03 14 views
18

Volevo provare il nuovo Snackbar dalla libreria di progettazione ufficiale fornita da Google. Il suo utilizzo è molto vicino a un toast, quindi ho pensato che sarebbe stato abbastanza semplice provarlo.Android SnackBar: errore di gonfiaggio SnackbarLayout

Ho provato su un emulatore con 5.1 e Samsung Galaxy S6 Edge con 5.0.

Il mio problema è che l'app si arresta in modo anomalo quando è necessario visualizzare lo Snackbar.

Codice

package com.jayway.andreas.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.design.widget.Snackbar; 
import android.view.View; 


public class MainActivity extends Activity { 

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

     findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Snackbar.make(v, R.string.test, Snackbar.LENGTH_LONG) 
         .setAction("Action!", new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           // NOP 
          } 
         }) 
         .show(); 
      } 
     }); 
    } 
} 

Disposizione:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:id="@+id/root_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    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" 
    tools:context=".MainActivity"> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="Button"/> 
</RelativeLayout> 

Gradle File

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "23.0.0 rc1" 

    defaultConfig { 
     applicationId "com.jayway.andreas.test" 
     minSdkVersion 21 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:design:22.2.0' 
} 

ho provato fornendo differe nt viste (RelativeLayout radice, vista pulsante e vista l'arredamento della finestra) come il primo parametro, ma non importa quale ho fornito io ancora ottenere il seguente stacktrace:

android.view.InflateException: Binary XML file line #18: Error inflating class android.support.design.widget.Snackbar$SnackbarLayout 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createView(LayoutInflater.java:640) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.inflate(LayoutInflater.java:483) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
E/AndroidRuntime(19107): at android.support.design.widget.Snackbar.<init>(Snackbar.java:119) 
E/AndroidRuntime(19107): at android.support.design.widget.Snackbar.make(Snackbar.java:140) 
E/AndroidRuntime(19107): at android.support.design.widget.Snackbar.make(Snackbar.java:164) 
E/AndroidRuntime(19107): at com.jayway.andreas.test.MainActivitykr8.51onClick(MainActivity.java:20) 
E/AndroidRuntime(19107): at android.view.View.performClick(View.java:5217) 
E/AndroidRuntime(19107): at android.view.View$PerformClick.run(View.java:20983) 
E/AndroidRuntime(19107): at android.os.Handler.handleCallback(Handler.java:739) 
E/AndroidRuntime(19107): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime(19107): at android.os.Looper.loop(Looper.java:145) 
E/AndroidRuntime(19107): at android.app.ActivityThread.main(ActivityThread.java:6141) 
E/AndroidRuntime(19107): at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime(19107): at java.lang.reflect.Method.invoke(Method.java:372) 
E/AndroidRuntime(19107): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
E/AndroidRuntime(19107): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 
E/AndroidRuntime(19107): Caused by: java.lang.reflect.InvocationTargetException 
E/AndroidRuntime(19107): at java.lang.reflect.Constructor.newInstance(Native Method) 
E/AndroidRuntime(19107): at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createView(LayoutInflater.java:614) 
E/AndroidRuntime(19107): ... 17 more 
E/AndroidRuntime(19107): Caused by: android.view.InflateException: Binary XML file line #34: Error inflating class <unknown> 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createView(LayoutInflater.java:640) 
E/AndroidRuntime(19107): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.inflate(LayoutInflater.java:480) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
E/AndroidRuntime(19107): at android.support.design.widget.Snackbar$SnackbarLayout.<init>(Snackbar.java:526) 
E/AndroidRuntime(19107): ... 20 more 
E/AndroidRuntime(19107): Caused by: java.lang.reflect.InvocationTargetException 
E/AndroidRuntime(19107): at java.lang.reflect.Constructor.newInstance(Native Method) 
E/AndroidRuntime(19107): at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
E/AndroidRuntime(19107): at android.view.LayoutInflater.createView(LayoutInflater.java:614) 
E/AndroidRuntime(19107): ... 28 more 
E/AndroidRuntime(19107): Caused by: java.lang.RuntimeException: Failed to resolve attribute at index 13 
E/AndroidRuntime(19107): at android.content.res.TypedArray.getDrawable(TypedArray.java:760) 
E/AndroidRuntime(19107): at android.view.View.<init>(View.java:3990) 
E/AndroidRuntime(19107): at android.widget.TextView.<init>(TextView.java:1021) 
E/AndroidRuntime(19107): at android.widget.TextView.<init>(TextView.java:1016) 
E/AndroidRuntime(19107): at android.widget.TextView.<init>(TextView.java:1012) 
E/AndroidRuntime(19107): ... 31 more 
+0

Hai provato a passare il layout radice come primo argomento? – Ziem

+0

Sì, ho aggiunto un ID al RelativeLayout e l'ho passato con lo stesso risultato. –

+0

@JaredBurrows Aggiornato con il layout, in realtà lo stavo aggiornando mentre digitavi la domanda così sei veloce :) –

risposta

32

Due pensieri su quello che potrebbe essere sbagliato .

In primo luogo, assicurarsi che si sta utilizzando il corretto dipendenza Gradle:

compile 'com.android.support:design:22.2.0' 

In secondo luogo, assicurarsi che la vostra attività sta estendendo AppCompatActivity e non Activity o ActionBarActivity.

Potete leggere l'full post per maggiori dettagli, ma ecco la citazione in questione circa la necessità AppCompat con la nuova libreria di supporto alla progettazione:

Nota che, come la libreria di design dipende dalla v4 Supporto e librerie di supporto AppCompat , quelli saranno inclusi automaticamente quando si aggiunge la dipendenza della libreria di progettazione.

Se volete sapere il motivo per cui, è possibile leggere this o this per più di fondo sulla nuova via "preferito" di Android di gestire callback, in particolare utilizzando AppCompatDelegate.

+0

La prima parte è già selezionata. La seconda parte non è una cosa che dovrei avere bisogno poiché questa è una libreria separata.Il che significa che dovrei essere in grado di avere questo solo ed essere ancora in grado di usarlo. –

+0

@AndreasN, vedere la mia risposta modificata. – hungryghost

+1

Questo l'ha risolto, grazie! Immagino che ogni attività dovrebbe essere basata su AppCompatActivity. –