Ошибка AnimationDrawable при нажатии кнопки

Я считаю, что мой xml правильный, но я не уверен, что вызывает эту ошибку в моем коде. Я пытаюсь попытаться нарисовать анимацию на кнопке изображения, но каждый раз, когда я нажимаю кнопку, я получаю сообщение об ошибке.

Вот мой список анимаций "music_icon":

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/selected" android:oneshot="true">
        <item android:drawable="@drawable/musicon1" android:duration="50" />
        <item android:drawable="@drawable/musicon2" android:duration="50" />
        <item android:drawable="@drawable/musicon3" android:duration="50" />
        <item android:drawable="@drawable/musicon4" android:duration="50" />
        <item android:drawable="@drawable/musicon5" android:duration="50" />
    </animation-list>

Моя основная активность.java:

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.graphics.drawable.AnimationDrawable;


public class HomeScreen extends AppCompatActivity {

ImageButton musicEnable_ImageButton;
Handler musicIcon_animate = new Handler();
int ArrayPos = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_screen);

    musicEnable_ImageButton = (ImageButton) findViewById(R.id.soundEnable_button);
    musicEnable_ImageButton.setBackgroundResource(R.drawable.musicoff);
    musicEnable_ImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            musicEnable_ImageButton.setBackgroundResource(R.drawable.music_icon);
            final AnimationDrawable frameAnimation = (AnimationDrawable) musicEnable_ImageButton.getBackground();
            frameAnimation.start();
        }
    });
}

мой макет.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".HomeScreen"
    android:background="@android:drawable/screen_background_dark_transparent"
    android:clickable="true"
    android:id="@+id/homescreen_view">

    <Button
        android:layout_width="100.0dp"
        android:layout_height="25.0dp"
        android:text="Help"
        android:id="@+id/instructionsButton"
        android:layout_alignParentTop="false"
        android:layout_alignParentStart="true"
        android:textColor="#05ffda"
        android:background="@android:color/holo_purple"
        android:longClickable="true" />

    <ImageButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:scaleType="centerCrop"
        android:id="@+id/soundEnable_button"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:longClickable="true"
        android:nestedScrollingEnabled="true"/>

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="100dp"
        android:layout_height="25dp"
        android:text="Highscores"
        android:id="@+id/highscores_button"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:background="@android:color/holo_purple"
        android:textColor="#05ffda" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="100dp"
        android:layout_height="30dp"
        android:text="Play Game"
        android:id="@+id/startGame_button"
        android:background="@android:color/holo_purple"
        android:textColor="#05ffda"
        android:layout_marginTop="175dp"
        android:singleLine="true"
        android:layout_alignParentTop="false"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

Ниже приведено сообщение об ошибке:

06-07 05:00:48.004 19844-19844/com.example.comp.app_name E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.AnimationDrawable
at com.example.comp.app_name.HomeScreen$1.onClick(HomeScreen.java:36)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

person 1QuickQuestion    schedule 07.06.2016    source источник
comment
stackoverflow.com/ вопросы/5299219/   -  person IntelliJ Amiya    schedule 07.06.2016


Ответы (1)


2 вещи:

  1. Измените свой рисунок (удалите тег selector):

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/selected" android:oneshot="true">
    <item android:drawable="@drawable/musicon1" android:duration="50" />
    <item android:drawable="@drawable/musicon2" android:duration="50" />
    <item android:drawable="@drawable/musicon3" android:duration="50" />
    <item android:drawable="@drawable/musicon4" android:duration="50" />
    <item android:drawable="@drawable/musicon5" android:duration="50" />
</animation-list>
  1. Я не вижу, как вы устанавливаете фон для musicEnable_ImageButton, вы только пытаетесь get его... Я что-то упустил, или вы просто забыли установить фон в первую очередь?
person Bartek Lipinski    schedule 07.06.2016
comment
простите меня, я новичок в этом, но что такое тег селектора? Что касается установки фона, setImageResource отличается от setBackgroundResource? Не могли бы вы привести пример? - person 1QuickQuestion; 07.06.2016
comment
Если вы сравните рисунок, который вы опубликовали, с тем, что опубликовал я, вы увидите, что закрывающая вещь больше не selector, а сама animation-list. setImageResource и setBackgroundResource это совершенно разные вещи. Это неотъемлемая часть ImageView. - person Bartek Lipinski; 07.06.2016
comment
удалил тег селектора и изменил его на setImageResource, и я все еще получаю ту же ошибку. - person 1QuickQuestion; 07.06.2016
comment
Изменено на setImageResource? - person Bartek Lipinski; 07.06.2016
comment
Мой оригинал: окончательный AnimationDrawable frameAnimation = (AnimationDrawable) musicEnable_ImageButton.getBackground(); musicEnable_ImageButton.setBackgroundResource(R.drawable.music_icon); Мое изменение: окончательное AnimationDrawable frameAnimation = (AnimationDrawable) musicEnable_ImageButton.getBackground(); musicEnable_ImageButton.setImageResource(R.drawable.music_icon); Я чувствую, что неправильно понял ваше второе предложение. - person 1QuickQuestion; 07.06.2016
comment
@1QuickQuestion Кроме того, вам вообще не нужны Runnable или Handler, если вы используете animation-list. frameAnimation.start() может работать в потоке пользовательского интерфейса. - person Bryan; 07.06.2016
comment
Во-первых, вы неправильно изменили setBackgroundResource на setImageResource. Я не говорил вам этого делать, я спросил вас, где вы устанавливали свой фон. Только это. И теперь я знаю, почему я не мог видеть этот звонок. Потому что порядок, в котором вы делаете вещи, не имеет никакого смысла. Почему вы сначала пытаетесь getBackground(), а потом пытаетесь установить ресурс на ImageView? Это не имеет никакого смысла. Является ли R.drawable.music_icon вашим animation-list? Если да, то измените порядок ваших звонков. Сначала setBackgroundResource, потом getBackground. - person Bartek Lipinski; 07.06.2016
comment
Что касается handler, то это бесполезно, достаточно frameAnimation.start(). - person Bartek Lipinski; 07.06.2016
comment
@BartekLipinski -_- Я внес все ваши изменения, но все еще получаю сообщение об ошибке. - person 1QuickQuestion; 07.06.2016
comment
Итак, какой у вас текущий код из OnClickListener - person Bartek Lipinski; 07.06.2016
comment
@Bryan Я пытаюсь использовать нажатие кнопки для смены режима. При нажатии кнопки я хочу, чтобы анимация запускалась (только после нажатия). Я удалил runnable, но я все еще получаю сбой. - person 1QuickQuestion; 07.06.2016
comment
Можете ли вы опубликовать свой текущий код? Может быть, как отредактировать ваш вопрос? - person Bartek Lipinski; 07.06.2016
comment
@BartekLipinski Я обновил свой вопрос с изменениями кода; снова я новичок в java/android-studio, так что все это незнакомо. - person 1QuickQuestion; 07.06.2016
comment
@1QuickQuestion Это все еще ClassCastException? Эта ошибка говорит вам, что у вас есть StateListDrawable вместо и AnimationDrawable. Похоже, что ваш XML наверху теперь правильный, но единственный способ получить StateListDrawable — это использовать тег <selector>. - person Bryan; 07.06.2016
comment
@ 1QuickQuestion А, это отдельная проблема. Насколько велики ваши музыкальные файлы изображений? Вы загружаете другие большие изображения на экран? - person Bryan; 07.06.2016
comment
@Bryan 700x700 .png файлы - person 1QuickQuestion; 07.06.2016
comment
@ 1QuickQuestion Это довольно много. Если вы уверены, что хотите, чтобы ваше приложение использовало такие большие изображения, я бы посоветовал установить android:largeHeap="true" для вашего приложения в манифесте, но это в основном превращает ваше приложение в пожирателя ресурсов. В противном случае, может быть, рассмотреть возможность использования значков меньшего размера? - person Bryan; 07.06.2016
comment
@1QuickQuestion ваша кнопка (soundEnable_button) имеет размер 50dpx50dp, вам наверняка не нужны png-файлы размером 700x700 для кадров анимации - person Bartek Lipinski; 07.06.2016
comment
@1QuickQuestion 50dp для xxxhdpi устройств (огромных) 200px - person Bartek Lipinski; 07.06.2016
comment
@BartekLipinski спасибо (я уменьшил размер изображений)! - person 1QuickQuestion; 08.06.2016