FloatingActionButtonを使ったらエラーの嵐だった話

Android で Floating Action Button を使おうとしたら,なぜかうまく動かなかったときの話です.私のケースでは,原因が概ね考えられるものとは全く異なっていましたが,参考までに書き残しておこうと思います.

Floating Action Button の基本的な実装

Floating Action Button が何かについてはマテリアルデザインのサイトを見るのが最もいいと思います.

build.gradle

build.gradle (Module: app)

dependencies {
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
}

XML

activity_main.xml

<android.support.design.widget.FloatingActionButton
    android:id="@+id/floating_action_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

ボタンのデザイン,配置に関する属性に関しては何も書いていません.

Java

MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

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

        // Setup FAB to open ExampleActivity
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floating_action_button);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, ExampleActivity.class);
                startActivity(intent);
            }
        });

ボタンをタップすると ExampleActivity クラスにインテントするときの処理だけ書いています.

エラーの原因として考えられるもの

上記のように書いておけば,やりがちなミスは防げているようです.依存関係の記述を忘れているとか,継承するクラスが間違っているとか.

これ以外にエラーが発生する原因となりうるのは,AppTheme です.Theme.AppCompat.Light.DarkActionBar などを指定しておきます.

テーマの指定は values/style.xml で記述したものを manifests/AndroidManifest.xml で指定して読み込むのが一般的な書き方になっています.

また,私のケースでは上記のいずれでもなく,ボタンに使用する画像として android:src="@drawable/ic_launcher_foreground" を指定していたのが問題だったようです.画像を用意してなかったのでテキトーに埋めていたせいです....しかも,書かなくても動作します.

後から気づきましたが,画像だと思って読み込んでいたものは XML でした....