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
何が悪いのかについての二つの考え。
まず、正しい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
の詳細を確認してください。