web-dev-qa-db-ja.com

Android SnackBar:SnackbarLayoutの膨張エラー

Googleが提供する公式デザインライブラリの新しいSnackbarを試してみたかった。使い方はトーストにとても近いので、試してみるのも簡単だと思いました。

5.1を実行しているエミュレータと、5.0を実行しているSamsung Galaxy S6 Edgeで試してみました。

私の問題は、Snackbarを表示することになっているときにアプリがクラッシュすることです。

コード

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

レイアウト:

<?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ファイル

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'
}

最初のパラメーターとしてさまざまなビュー(ルートRelativeLayout、ボタンのビュー、およびウィンドウの装飾ビュー)を提供しようとしましたが、提供したものに関係なく、次のスタックトレースを取得します。

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
18
Andreas N

何が悪いのかについての二つの考え。

まず、正しいgradle依存関係を使用していることを確認してください:

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

次に、アクティビティがAppCompatActivityまたはActivityではなくActionBarActivityを拡張していることを確認します。

詳細については full post を参照してください。ただし、AppSupportと新しいサポートデザインライブラリが必要なことについて、関連する引用を以下に示します。

DesignライブラリはSupport v4とAppCompat Support Librariesに依存しているため、Designライブラリの依存関係を追加すると、それらも自動的に含まれます。

理由を知りたい場合は、 this または this を読んで、Androidの新しい「推奨」コールバック処理方法、特にAppCompatDelegateの詳細を確認してください。

33
hungryghost